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).*