积极的前瞻没有按预期工作

时间:2015-07-10 18:19:52

标签: regex regex-lookarounds

我有以下正则表达式,前瞻性:

/black(?=hand)[ s]/

我希望它匹配 blackhands blackhand 。但是,它与任何东西都不匹配。我正在Regex101进行测试。

我做错了什么?

3 个答案:

答案 0 :(得分:6)

Lookahead不会消耗被搜索的字符串。这意味着[ s]正在尝试匹配空格,或者黑色后紧跟 s 。但是,您的前瞻声明必须遵循黑色,因此正则表达式永远不会匹配任何内容。

要在使用前瞻时匹配 blackhands blackhand ,请在前瞻中移动[ s]black(?=hand[ s])。或者,根本不要使用前瞻:blackhand[ s]

答案 1 :(得分:3)

您的正则表达式与blackhandsblackhands不匹配,因为它正在尝试在文本{{1}之后匹配空格或字母s(字符类[ s])并且black之后也向前看hand

要匹配这两个输入,您需要这个前瞻:

black

或者只是不要使用任何前瞻并使用:

/black(?=hands?)/

Good reference on lookarounds

答案 2 :(得分:1)

简而言之,您应该使用

/\bblackhands?\b/

现在,你的正则表达式对于这项任务来说有点过于复杂。它由

组成
  • black - 字面上匹配black
  • (?=hand) - 要求 handblack - 之后出现,但不消耗字符,引擎保持不变的正向前瞻在字符串中的位置!
  • [ s] - 与s 之后的空格或black - 强制匹配的字符类。

因此,您永远不会收到匹配项,因为空格或s未显示在hand的第一个位置(h)。

这是how lookarounds work

  

不同之处在于环视实际匹配字符,但放弃匹配,仅返回结果:匹配或不匹配。这就是为什么他们被称为"断言" 。它们不消耗字符串中的字符,但仅断言是否可以匹配。

在您的情况下,没有必要。 只需使用\b - word boundary - 即可匹配整个单词blackhandblackhands