答案 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步:\B
与m
和e
之间的位置匹配。继续。
步骤9:到达模式结束。返回匹配值:Welcom
。
答案 1 :(得分:1)
+
贪婪,它试图匹配一切。因此,\w+
匹配整个输入后,引擎会尝试匹配\S
并失败,因此它会回溯并尝试与之前的\w+
匹配。它会一直这样做,直到找到(或没有)匹配。