我有以下正则表达式,前瞻性:
/black(?=hand)[ s]/
我希望它匹配 blackhands 或 blackhand 。但是,它与任何东西都不匹配。我正在Regex101进行测试。
我做错了什么?
答案 0 :(得分:6)
Lookahead不会消耗被搜索的字符串。这意味着[ s]
正在尝试匹配空格,或者黑色后紧跟 s 。但是,您的前瞻声明手必须遵循黑色,因此正则表达式永远不会匹配任何内容。
要在使用前瞻时匹配 blackhands 或 blackhand ,请在前瞻中移动[ s]
:black(?=hand[ s])
。或者,根本不要使用前瞻:blackhand[ s]
。
答案 1 :(得分:3)
您的正则表达式与blackhands
或blackhands
不匹配,因为它正在尝试在文本{{1}之后匹配空格或字母s
(字符类[ s]
)并且black
之后也向前看hand
。
要匹配这两个输入,您需要这个前瞻:
black
或者只是不要使用任何前瞻并使用:
/black(?=hands?)/
答案 2 :(得分:1)
简而言之,您应该使用
/\bblackhands?\b/
现在,你的正则表达式对于这项任务来说有点过于复杂。它由
组成black
- 字面上匹配black
(?=hand)
- 要求 hand
在black
- 之后出现,但不消耗字符,引擎保持不变的正向前瞻在字符串中的位置! [ s]
- 与s
之后的空格或black
- 强制匹配的字符类。 因此,您永远不会收到匹配项,因为空格或s
未显示在hand
的第一个位置(h
)。
不同之处在于环视实际匹配字符,但放弃匹配,仅返回结果:匹配或不匹配。这就是为什么他们被称为"断言" 。它们不消耗字符串中的字符,但仅断言是否可以匹配。
在您的情况下,没有必要。
只需使用\b
- word boundary - 即可匹配整个单词blackhand
或blackhands
。