如何避免正则表达式回溯,改写长尾词的正则表达式?

2026-03-30 09:280阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2479个文字,预计阅读时间需要10分钟。

如何避免正则表达式回溯,改写长尾词的正则表达式?

当扫描一个正则表达式目标字符串时,从左到右逐个分析正则表达式的组成部分。在每个位置上,测试是否能找到一个匹配。对于每个词汇和分支,都必须确定如何连续进行。如果是一““,则直接输出结果。

当一个正则表达式扫描目标字符串时,从左到右逐个扫描正则表达式的组成部分,在每个位置上测试能不能找到一个匹配。对于每一个量词和分支,都必须确定如何继续进行。如果是一个量词(如*、+?或者{2,}),那么正则表达式必须确定何时尝试匹配更多的字符;如果遇到分支(通过|操作符),那么正则表达式必须从这些选项中选择一个进行尝试。

当正则表达式做出这样的决定时,如果有必要,它会记住另一个选项,以备返回后使用。如果所选方案匹配成功,正则表达式将继续扫描正则表达式模板,如果其余部分匹配也成功了,那么匹配就结束了。但是,如果所选择的方案未能发现相应匹配,或者后来的匹配也失败了,正则表达式将回溯到最后一个决策点,然后在剩余的选项中选择一个。继续这样,直到找到一个匹配,或者量词和分支选项的所有可能的排列组合都尝试失败后放弃这一过程,然后移动到此过程开始位置的下一个字符上,重复此过程。

如何避免正则表达式回溯,改写长尾词的正则表达式?

例如,下面的代码演示了这一过程是如何通过回溯处理分支的。

/h(ello|appy) hippo/.test("hello there, happy hippo");

上面一行正则表达式用于匹配“hello hippo”或“happy hippo”。

阅读全文

本文共计2479个文字,预计阅读时间需要10分钟。

如何避免正则表达式回溯,改写长尾词的正则表达式?

当扫描一个正则表达式目标字符串时,从左到右逐个分析正则表达式的组成部分。在每个位置上,测试是否能找到一个匹配。对于每个词汇和分支,都必须确定如何连续进行。如果是一““,则直接输出结果。

当一个正则表达式扫描目标字符串时,从左到右逐个扫描正则表达式的组成部分,在每个位置上测试能不能找到一个匹配。对于每一个量词和分支,都必须确定如何继续进行。如果是一个量词(如*、+?或者{2,}),那么正则表达式必须确定何时尝试匹配更多的字符;如果遇到分支(通过|操作符),那么正则表达式必须从这些选项中选择一个进行尝试。

当正则表达式做出这样的决定时,如果有必要,它会记住另一个选项,以备返回后使用。如果所选方案匹配成功,正则表达式将继续扫描正则表达式模板,如果其余部分匹配也成功了,那么匹配就结束了。但是,如果所选择的方案未能发现相应匹配,或者后来的匹配也失败了,正则表达式将回溯到最后一个决策点,然后在剩余的选项中选择一个。继续这样,直到找到一个匹配,或者量词和分支选项的所有可能的排列组合都尝试失败后放弃这一过程,然后移动到此过程开始位置的下一个字符上,重复此过程。

如何避免正则表达式回溯,改写长尾词的正则表达式?

例如,下面的代码演示了这一过程是如何通过回溯处理分支的。

/h(ello|appy) hippo/.test("hello there, happy hippo");

上面一行正则表达式用于匹配“hello hippo”或“happy hippo”。

阅读全文