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

Positive lookahead not working as expected

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

/black(?=hand)[ s]/

我希望它匹配 blackhandsblackhand。但是,它不匹配任何内容。我正在 Regex101.

上测试

我做错了什么?

您的正则表达式不匹配 blackhandsblackhands,因为它试图匹配 space 或字母 s(字符 class [ s]) 就在文本 black 之后,也在 black.

之后展望 hand

要匹配两个输入,您需要先行:

/black(?=hands?)/

或者不使用任何前瞻并使用:

/blackhands?/

Good reference on lookarounds

Lookahead 不使用正在搜索的字符串。这意味着 [ s] 试图匹配紧跟在 black 之后的 space 或 s。但是,您的前瞻性说明 hand 必须遵循 black,因此正则表达式永远无法匹配任何内容。

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

简而言之,你应该使用

/\bblackhands?\b/

现在,您的正则表达式对于这项任务来说有点太复杂了。它包括

  • black - 按字面意思匹配 black
  • (?=hand) - 要求 handblack - 之后立即出现但不消耗字符,引擎保持在字符串中的相同位置!
  • [ s] - 字符 class 匹配 space 或 s - 必须紧跟在 black[= 之后48=].

所以,你永远不会得到你的比赛,因为 space 或 s 没有出现在 hand 的第一个位置(它是 h).

这是how lookarounds work:

The difference is that lookaround actually matches characters, but then gives up the match, returning only the result: match or no match. That is why they are called "assertions". They do not consume characters in the string, but only assert whether a match is possible or not.

你的情况是没有必要的。 只需使用 \b - a word boundary - 匹配整个单词 blackhandblackhands.