Iam在此参考后调查正则表达式背后的外观: regexinfo
要测试的引擎:engine to text regex
假设我有这个正则表达式使用lookbehind:
(?<=a)b
输入文字为&#34; ab&#34;。这个正则表达式工作正常,匹配&#39; b&#39;在&#34; ab&#34;。但是当我在正则表达式中添加单词边界时:
\b(?<=a)b\b
然后正则表达式将不会匹配&#39; b&#39;在&#34; ab&#34;了。但我在这里没有看到任何不同。 我可以在这里解释正则表达式引擎的工作流程:
(?<=a)
将从&#39; a&#39;开始。在&#34; ab&#34;中,它会在后面找到&#39; a&#39;并且无法找到&#39;所以它移动到下一个位置是&#39; b&#39;。在这里,它看起来落后,发现&#39; a&#39;所以它阻止了后视,当前的角色是&#39; b&#39;也匹配&#34; b&#34;在正则表达式中,正则表达式必须返回匹配结果,即&#39; b&#39;但没有找到匹配。我是否误解了这种情况?
答案 0 :(得分:1)
首先,你的lookbehind错过了一个类型标识符,它应该是(?<=...)
。其次,让我们删除lookbehind:
\bb\b
这意味着单独b
。边界不允许任何后续或前面的字母或数字位于相同类型([a-zA-Z0-9_]
)字符的任一侧。现在让我们回头看看:
\b(?<=a)b\b
这匹配单词边界(单词字符不会遇到另一个单词字符 - 或 - 单词的开头)然后查找从未出现的前面的a
。在b
之前,由于字边界,字母或数字永远不会出现,所以这永远不会匹配。它总是失败。
答案 1 :(得分:0)
我仍然对@revo的答案感到困惑,所以我试着深入了解Regex引擎的工作方式以及单词边界“\ b”的细节。我发现这些参考非常有用:
how Regex engine works reference
所以我的正则表达式:\b(?<=a)b\b
和我的输入"ab"
我可以通过正则表达式引擎的工作方式来解释:
所以“ab”可以匹配正则表达式模式“\ b(?&lt; -a)b \ b