首页 > 解决方案 > 正则表达式效率

问题描述

给定这个字符串

xxv jkxxxxxxxxxxxxxxx xxyu xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxAp oSxx
xxAp oSxxxxxxxxxxxxxxxxxxxxxj xxxxxxxxxuixxxxxxxxxxx axxxxxxxxxxxxxxxxxx

和这个正则表达式

^[^\r\n]*Ap oS[^\r\n]*

我正在寻找匹配包含任何地方的任何行,如此Ap oS所示,它就是这样做的。

现在,通过查看调试器,如果我理解正确的话,由于回溯,第一次匹配需要 16 步,第二次匹配需要 80 步。

我的问题是,如何编写这个正则表达式来减少步数?

[^\r\n]*我想用替换第一个(?!Ap oS)*来匹配所有不是的Ap oS,直到找到Ap oS,但我不确定我是否得到了概念或语法错误,或两者兼而有之。

任何帮助表示赞赏

标签: regexperformancepcre

解决方案


您想在此处应用展开循环技术

^[^A\r\n]*(?:A(?!p oS)[^A\r\n]*)*Ap oS[^\r\n]*

查看正则表达式演示

细节

  • ^- 字符串的开始
  • [^A\r\n]*- 除了 CR、LF 和 0+ 字符A
  • (?:A(?!p oS)[^A\r\n]*)*- 0 次或多次出现Anot 后跟,p oS然后是 0+ 字符,而不是 CR、LF 和A
  • Ap oS- 你的字符串
  • [^\r\n]*- CR 和 LF 以外的 0 个或多个字符。

推荐阅读