Regex 正向前瞻未按预期工作

Regex 正向前瞻未按预期工作,regex,regex-lookarounds,Regex,Regex Lookarounds,我有以下具有积极前瞻性的正则表达式: /black(?=hand)[ s]/ /black(?=hands?)/ 我希望它能匹配黑手或黑手。然而,它与任何东西都不匹配。我正在测试 我做错了什么?您的正则表达式没有匹配黑手或黑手,因为它正试图匹配一个空格或字母s(字符类[s]),就在文本黑色之后,也在黑色之后向前看黑手 要匹配这两个输入,您需要此前瞻: /black(?=hand)[ s]/ /black(?=hands?)/ 或者只是不要使用任何前瞻,而是使用: /blackhands?

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

/black(?=hand)[ s]/
/black(?=hands?)/
我希望它能匹配黑手黑手。然而,它与任何东西都不匹配。我正在测试


我做错了什么?

您的正则表达式没有匹配
黑手
黑手
,因为它正试图匹配一个空格或字母
s
(字符类
[s]
),就在文本
黑色
之后,也在
黑色
之后向前看
黑手

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

/black(?=hand)[ s]/
/black(?=hands?)/
或者只是不要使用任何前瞻,而是使用:

/blackhands?/

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


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

简而言之,您应该使用

/\bblackhands?\b/
现在,你的正则表达式对于这个任务来说有点太复杂了。它包括

  • 黑色
    -按字面意思匹配
    黑色
  • (?=hand)
    -一个积极的前瞻性要求
    hand
    出现在
    黑色
    -之后,但不使用字符,引擎保持在字符串中的相同位置
  • [s]
    -与空格或
    s
    -匹配的字符类,强制位于
    黑色之后
因此,您将永远无法获得匹配项,因为空格或
s
不会出现在
手的第一个位置(它是
h
)。

这是:

区别在于lookaround实际上匹配字符,但是放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不使用字符串中的字符,而只声明匹配是否可能

在您的情况下,这是不必要的。
只需使用
\b
-a-匹配整个单词
blackhand
blackhands

您是否确实要匹配“blackhand”后面的空格,还是要确保后面没有“s”以外的字母?如果要匹配“s”或单词的结尾,可以使用
(?:s |\b)
而不是
[s]
,其中
\b
匹配单词边界(单词的开头或结尾)。然后,当它位于字符串末尾(后跟零)、句子末尾(后跟句点)、行尾(后跟换行)、子句末尾(后跟逗号)或任何其他标点符号时,它将匹配“blackhand”,它们不会移动当前的匹配位置。因此,如果你期待着
你好
,然后尝试匹配
再见
,它永远不会匹配。Fwiw
/blackhands?/
就是您要找的。谢谢你们两位;)你清除了好东西