Regex 正则表达式-排除匹配模式
我要排除以下模式Regex 正则表达式-排除匹配模式,regex,regex-lookarounds,negative-lookahead,lookaround,Regex,Regex Lookarounds,Negative Lookahead,Lookaround,我要排除以下模式 make it cheaper make it cheapere makeitcheaper.com.au makeitcheaper making it cheaper www.make it cheaper ww.make it cheaper.com 我已经创建了一个正则表达式来匹配其中任何一个。但是,我想得到除这些以外的所有东西。我不知道如何反转我创建的正则表达式 mak(e|ing) ?it ?cheaper 上面的模式匹配列出的所有字符串。现在我想让它和其他东西
make it cheaper
make it cheapere
makeitcheaper.com.au
makeitcheaper
making it cheaper
www.make it cheaper
ww.make it cheaper.com
我已经创建了一个正则表达式来匹配其中任何一个。但是,我想得到除这些以外的所有东西。我不知道如何反转我创建的正则表达式
mak(e|ing) ?it ?cheaper
上面的模式匹配列出的所有字符串。现在我想让它和其他东西匹配。我该怎么做
从搜索结果来看,我似乎需要一些类似于消极前瞻/回顾的东西。但是,我真的不明白。有人能给我指出正确的方向吗?消极的前瞻,我相信这就是你想要的。也许可以试试:
(?!.*mak(e|ing) ?it ?cheaper)
也许更灵活一点:
(?!.*mak(e|ing) *it *cheaper)
以防有多个空格。您可以将其放在负面展望中,如下所示:
(?!mak(e|ing) ?it ?cheaper)
就像这是行不通的,因为如果你做一个matches
1,它将不匹配,因为你只是向前看,你实际上没有匹配任何东西,如果你做一个find
1,它将匹配很多次,因为你可以从字符串中的很多地方开始,其中下一个字符与上面的字符不匹配
要解决此问题,根据您的意愿,我们有两种选择:
^
)和结束($
):
^(?!mak(e|ing) ?it ?cheaper$).*
*
(零个或多个通配符)是实际发生的匹配。从第一个字符开始的负前瞻检查^((?!mak(e|ing) ?it ?cheaper).)*$
另一种方法是在前瞻的开头添加通配符(即,从字符串的开头排除所有包含任何内容的字符串,然后是您的模式),但我目前不认为这有任何好处(任意长度的前瞻也不太可能被任何给定的工具支持):
^
和$
,执行查找
或匹配
将适用于上述任何一项(但是,在匹配
的情况下,^
是可选的,在查找
的情况下,前瞻之外的*
是可选的)
1:尽管它们可能不会被称为regex,但许多语言的函数相当于
匹配
和查找
以上是这个问题的严格正则表达式答案 更好的方法可能是坚持原来的正则表达式(
mak(e|ing)?it?更便宜
),看看是否可以直接用所使用的工具或语言否定匹配
例如,在Java中,这需要执行if(!string.matches(originalRegex))
(注意!
,它否定返回的布尔值),而不是if(string.matches(negLookRegex))
^(?!.*mak(e|ing) ?it ?cheaper).*