为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式和否定整个字符组

正则表达式和否定整个字符组

噜噜哒 2019-08-09 16:13:45
正则表达式和否定整个字符组我正在尝试一些我认为应该对我来说相当明显的东西,但事实并非如此。我正在尝试匹配一个不包含特定字符序列的字符串。我已尝试使用[^ab],[^(ab)]等等来匹配不包含'a'或'b'的字符串,或只包含'a'或仅'b'或'ba'但不匹配'ab'的字符串。我给出的例子不符合'ab'这是真的,但它们也不会单独匹配'a'而我需要它们。有一些简单的方法可以做到这一点吗?
查看完整描述

3 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

使用否定前瞻:

^(?!.*ab).*$

更新:在下面的评论中,我说这种方法比彼得的答案慢。从那时起我就进行了一些测试,结果发现它确实稍微快一些。然而,偏爱另一种技术的原因不是速度,而是简单性。

另一种技术,在这里描述为一种驯化的贪婪令牌,适用于更复杂的问题,例如匹配分隔符文本,其中分隔符由多个字符组成(如HTML,如Luke 在下面评论的那样)。对于问题中描述的问题,它太过分了。

对于任何感兴趣的人,我测试了一大块Lorem Ipsum文本,计算不包含单词“quo”的行数。这些是我使用的正则表达式:

(?m)^(?!.*\bquo\b).+$(?m)^(?:(?!\bquo\b).)+$

无论是在整个文本中搜索匹配,还是将其分解为行并单独匹配,锚定前瞻一直优于浮动前瞻。


查看完整回答
反对 回复 2019-08-09
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

使用类似的字符类[^ab]将匹配不在字符集内的单个字符。(^作为否定的部分)。


要匹配不包含多字符序列的字符串ab,您需要使用否定前瞻:


^(?:(?!ab).)+$


并且正则表达式注释模式中的上述表达是:


(?x)    # enable regex comment mode

^       # match start of line/string

(?:     # begin non-capturing group

  (?!   # begin negative lookahead

    ab  # literal text sequence ab

  )     # end negative lookahead

  .     # any single character

)       # end non-capturing group

+       # repeat previous match one or more times

$       # match end of line/string


查看完整回答
反对 回复 2019-08-09
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

是的,它被称为负向前瞻。它是这样的 - (?!regex here)。所以abc(?!def)将匹配abc 而不是def。所以它会匹配abce,abc,abck等。

同样有积极的前瞻 - (?=regex here)。所以abc(?=def)匹配abc后跟def。

也有负面和正面的背后 - (?<!regex here)(?<=regex here)分别

需要注意的一点是,负前瞻是零宽度。也就是说,它不算是占用了任何空间。

所以它可能看起来像a(?=b)c匹配“abc”但它不会。它将匹配'a',然后是'b'的正向前瞻,但它不会向前移动到字符串中。然后它会尝试将'c'与'b'匹配,这将无效。类似地,^a(?=b)b$匹配'ab'而不是'abb',因为外观是零宽度(在大多数正则表达式实现中)。

有关页面的更多信息


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 794 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信