关于正则表达式的回溯

about backtrack of regex

大家好。我有一个问题。

在6级,为什么要倒退到'Welco'?

我认为回溯到 'Welcom' 在 6 级是正确的。

已经在4级使用过'Welcom'?

英文写作很难。:)

+ 是贪心的,它试图匹配所有的东西。因此,一旦 \w+ 匹配了整个输入,引擎就会尝试匹配 \S 并失败,因此它会回溯并尝试与前一步的 \w+ 匹配。它会继续这样做,直到找到(或没有)匹配项。

[a-z]\w+\S\B 模式不是一个好的模式。为什么?因为相邻的子模式可以相互匹配。这就是为什么在具有如此基本子模式的如此短的输入中有 3 个回溯步骤。

现在,一旦您理解了子模式的作用,一切就会变得清晰起来。

第 1 步:我们找到了字符串中的空位置(正则表达式引擎检查输入字符串中的每个位置)。

第2步[a-z]匹配第一个字符W(因为模式不区分大小写。

第 3 步\w+ 匹配 elcome,因为这是文本的单词字符块。所有这些字符都被添加到匹配值中(Welcome 此时已经!但是仍然有子模式要尝试匹配。因此,正则表达式引擎继续努力工作。)

步骤 4:正则表达式引擎尝试为 \S(非空白)子模式容纳一些文本。它回溯,即产生最后一个字符来测试它是否可以与 \S 子模式匹配。

第5步:最后e符合要求。现在我们仍然有 Welcome 在比赛中,但是最后 e "belongs" 到 \S 子模式。

步骤6: e\S匹配后不跟非词边界(因为如果最后一个字符是单词字符,\B 不匹配字符串的末尾)。这一事实使 e\S 子模式的匹配无效。因此,正则表达式引擎必须再次回溯以重新容纳 \S 子模式的值。 e 无法匹配到 \S,因此回溯到 m。这就是为什么第 6 步的正则表达式索引紧跟在 o.

之后

步骤7\S可以匹配m,所以现在m"belongs"到\S子模式.

步骤 8\B 匹配 me 之间的位置。继续。

第9步:模式结束。返回匹配值:Welcom.