关于正则表达式的回溯

时间:2016-02-28 14:05:49

标签: regex backtracking

enter image description here

大家好。我有一个问题。

在第6级,为什么要回到Welco'

我想回到“欢迎来访”。在6级是正确的。

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

英语写作非常困难。:)

2 个答案:

答案 0 :(得分:2)

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

现在,一旦你理解了子模式的作用,一切都会变得清晰。

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

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

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

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

第5步:最后e符合要求。现在我们在匹配中仍有Welcome,但最后e“属于”\S子模式。

第6步 :与e匹配的\S未跟随非字边界(因为\B没有如果最后一个字符是单词字符,则在字符串末尾匹配。这一事实使e无效,成为\S子模式的匹配项。因此,正则表达式引擎必须再次回溯以重新调整\S子模式的值。 e无法与\S匹配,因此,回溯转到m。这就是为什么步骤6中的正则表达式索引正好在o之后。

第7步\S可以与m匹配,因此现在m“属于”\S子模式。

第8步\Bme之间的位置匹配。继续。

步骤9:到达模式结束。返回匹配值:Welcom

答案 1 :(得分:1)

+贪婪,它试图匹配一切。因此,\w+匹配整个输入后,引擎会尝试匹配\S并失败,因此它会回溯并尝试与之前的\w+匹配。它会一直这样做,直到找到(或没有)匹配。