Regex 正则表达式效率

Regex 正则表达式效率,regex,performance,pcre,Regex,Performance,Pcre,考虑到这个字符串 xxv jkxxxxxxxxxxxxxxx xxyu xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxAp oSxx xxAp oSxxxxxxxxxxxxxxxxxxxxxj xxxxxxxxxuixxxxxxxxxxx axxxxxxxxxxxxxxxxxx 这个正则表达式呢 ^[^\r\n]*Ap oS[^\r\n]* 我希望匹配任何包含Ap oS的行,如图所示 现在,如果我理解正确的话,通过观察第一场比赛,我们可以看到第一场比赛走了16步

考虑到这个字符串

xxv jkxxxxxxxxxxxxxxx xxyu xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxAp oSxx
xxAp oSxxxxxxxxxxxxxxxxxxxxxj xxxxxxxxxuixxxxxxxxxxx axxxxxxxxxxxxxxxxxx
这个正则表达式呢

^[^\r\n]*Ap oS[^\r\n]*
我希望匹配任何包含
Ap oS
的行,如图所示

现在,如果我理解正确的话,通过观察第一场比赛,我们可以看到第一场比赛走了16步,第二场比赛走了80步,这是因为回溯

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

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

非常感谢您的帮助

如果您想在此处应用:

详细信息

  • ^
    -字符串的开头
  • [^A\r\n]*
    -0+字符,CR、LF和
    A除外
  • (?:A(?!p oS)[^A\r\n]*)*
    -0次或多次出现
    A
    后不跟
    p oS
    ,然后是0+字符,而不是CR、LF和
    A
  • Ap操作系统
    -您的字符串
  • [^\r\n]*
    -0个或更多字符,CR和LF除外
您可以通过以下模式之一以更简单有效的方式应用展开循环技术:

^(?:[^A\r\n]*A)+?p oS.*

(请注意,pcre会在
[^A\r\n]*A
中自动使量词
*
具有所有格,因为
A
遵循一个重复的字符类,而该字符类被排除在外。换句话说,用原子组替换此子模式周围的非捕获组或明确使量词具有所有格是无用的。)

或者,如果希望文字部分完全显示:

^[^A\r\n]*+(?>A[^A\r\n]*)*?Ap oS.*

您不需要使用前瞻,因为这是不情愿的量词在这里所做的(它在每个组迭代之后测试下一个子模式)


请注意,由于您正在查找包含文字字符串的行,并且如果您的数据来自文件,那么在许多编程语言中,只需逐行读取文件并使用基本字符串函数对其进行过滤可能会更有趣


根据pcre中的默认换行符序列和字符串中使用的换行符序列,模式末尾的*可以匹配回车符。为了避免这种行为,您可以明确地设置换行符序列,从模式开始使用
(*CRLF)



减少模式的步骤数是提高模式效率的一种方法,但请注意不要仅为此目的构建太长或太复杂的模式,因为这也可能会适得其反。

详细说明此点,请参阅,并添加一些不匹配的行。这表示
2个匹配,50个步骤
。然而,只要看一看,就会看到489个步骤。看起来这项技术将采取更多的步骤,更少的匹配线和这些线的结构。为了改进这些不匹配行所采取的步骤,我实现了20%的改进。但是,第4行仍然存在问题。有什么办法可以进一步改进吗?谢谢@Casimir非常有帮助。最后一个问题,在你的最后一个问题中,它说
2个匹配,47个步骤(~0ms)
hoevwer,当你查看它时,它显示339个步骤。这些数字显示了什么?哪一个应该用作基准?@fionpo:如果你想对一个模式进行基准测试,请使用几个真实的字符串对其进行测试,并对其进行多次计时。请注意,调试器不考虑pcre优化。
^[^A\r\n]*+(?>A[^A\r\n]*)*?Ap oS.*