Regex功效

问题描述 投票:0回答:1

给定这个字符串

xxv jkxxxxxxxxxxxxxxx xxyu xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxAp oSxx
xxAp oSxxxxxxxxxxxxxxxxxxxxxj xxxxxxxxxuixxxxxxxxxxx axxxxxxxxxxxxxxxxxx

而这个regex

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

我希望能匹配任何包含 Ap oS 如图 此处它就是这样做的。

现在,通过观察 调试器 如果我理解正确的话,可以看到第一个匹配用了16步,第二个匹配用了80步。

我的问题是,如何写这个regex来降低步数?

我想把第一个 [^\r\n]*(?!Ap oS)* 以配合一切非 Ap oS,直到它发现 Ap oS但我不知道是我的概念或语法出了问题,还是两者都出了问题。

希望得到任何帮助

regex performance pcre
1个回答
0
投票

你可以应用 开圈 使用这些模式中的一种,以更简单有效的方式实现技术。

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

演示

(请注意,pcre使量化符为 * 自动占有式 [^A\r\n]*A 自从 A 跟随一个重复的字符类,从那里排除。换句话说,用原子组代替这个子类周围的非捕捉组,或者明确地使量化符占有式是没有用的)。)

或者如果你希望字面部分完全出现。

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

演示

你不需要使用lookahead,因为这就是勉强量化器在这里做的事情(它在每次分组迭代后测试下一个子模式)。


需要注意的是,由于你要寻找的是包含字面字符串的行,如果你的数据来自一个文件,那么在许多编程语言中,简单地逐行读取文件并使用基本的字符串函数进行过滤可能更有趣。


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


减少模式的步骤数是提高模式效率的方法之一,但要注意不要只为此目的建立一个太长或太复杂的模式,因为这也会产生反作用。


1
投票

你想应用 开环术 这里。

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

请看 搜索引擎演示

详细内容

  • ^ - 弦首
  • [^A\r\n]* - 0+除CR、LF和以外的其他字符。A
  • (?:A(?!p oS)[^A\r\n]*)* - 0次或更多次出现 A 无下文 p oS 然后是除CR、LF和以外的0+字符 A
  • Ap oS - 你的字符串
  • [^\r\n]* - 0个或更多除CR和LF以外的字符。
© www.soinside.com 2019 - 2024. All rights reserved.