【问题标题】:How do I negate a regex statement?如何否定正则表达式语句?
【发布时间】:2016-05-25 19:53:27
【问题描述】:

我一直在玩正则表达式高尔夫,并确定了一个正则表达式,其中包含我不应该匹配的所有单词,并且没有我应该匹配的单词。我的想法是我可以简单地否定正则表达式,然后得到相反的结果(包括我应该匹配的所有单词,而没有其他单词)。

我想出的正则表达式(\w)(\w)\2\1 匹配任何带有abba 模式的东西,所以我认为使用否定环视(?!(\w)(\w)\2\1) 可以匹配任何不属于abba 模式的东西,但是现在它只是突出显示了所有内容,如果你想试试,这里是 URL:http://regex.alf.nu/4

【问题讨论】:

  • 如果这是一个选项,请使用grep -v
  • ^(?!\w*(\w)(\w)\2\1).*?
  • @InnocentBystander 这是一个基于 Web 的界面,因此不允许使用 grep
  • @WiktorStribiżew 是的,这行得通!你能解释一下为什么这有效而我尝试的方法无效吗?
  • ^(?!.*(.)(.)\2\1) 在您的网站中获得 193 分

标签: regex ecmascript-6 regex-negation


【解决方案1】:

在我看来,您想排除包含那些重复符号的匹配字符串。因此,您需要在字符前添加\w*(0 个或多个单词字符)以测试是否重复。

使用

^(?!\w*(\w)(\w)\2\1).*
    ^^^    

请参阅regex demo

因此,(?!\w*(\w)(\w)\2\1) 前瞻在字符串的开头执行以下检查:如果有 0+ 个字母数字/下划线字符后跟 1 和 2 个字符,然后是第二个和第一个捕获的字符,没有匹配返回(匹配失败)。

如果您不打算匹配文本,则不需要 .* 部分(即,如果您只是检查是否存在匹配)。但是,如果您想排除匹配空字符串,只需使用 .+ 而不是 .*+ 匹配 1 次或多次出现的量化子模式)。

【讨论】:

  • 啊,锚是必要的,以排除空字符串,然后是吗?
  • 不,要确保字符串不为空,可以在末尾使用.+。您只是没有准确说明空匹配的预期行为。
猜你喜欢
  • 2015-04-08
  • 2017-04-14
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多