当与边界

时间:2018-05-23 12:03:02

标签: regex

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;了。但我在这里没有看到任何不同。 我可以在这里解释正则表达式引擎的工作流程:

  • &#34; \ b&#34;在正则表达式中将匹配字符串&#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;但没有找到匹配。

我是否误解了这种情况?

2 个答案:

答案 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

word boundary reference

所以我的正则表达式:\b(?<=a)b\b和我的输入"ab"我可以通过正则表达式引擎的工作方式来解释:

  • 步骤1:正则表达式引擎位于字符串“ab”中的“a”,我尝试将令牌“\ b”与前一个字符“a”(即无效字符)匹配。这匹配,所以引擎前进到正则表达式中的下一个位置“(?&lt; = a)”
  • Step2:字符串的当前位置仍为'a',后面的外观尝试在当前'a'之前找到'a'字符,但这是无效字符且匹配失败,引擎然后移动到下一个位置字符串'b'
  • 第3步:引擎尝试将正则表达式的第一个标记'\ b'与'b'匹配,这失败了。

所以“ab”可以匹配正则表达式模式“\ b(?&lt; -a)b \ b