关于正则表达式的回溯
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
匹配 m
和 e
之间的位置。继续。
第9步:模式结束。返回匹配值:Welcom
.
大家好。我有一个问题。
在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
匹配 m
和 e
之间的位置。继续。
第9步:模式结束。返回匹配值:Welcom
.