给定这个字符串
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
但我不知道是我的概念或语法出了问题,还是两者都出了问题。
希望得到任何帮助
你可以应用 开圈 使用这些模式中的一种,以更简单有效的方式实现技术。
^(?:[^A\r\n]*A)+?p oS.*
(请注意,pcre使量化符为 *
自动占有式 [^A\r\n]*A
自从 A
跟随一个重复的字符类,从那里排除。换句话说,用原子组代替这个子类周围的非捕捉组,或者明确地使量化符占有式是没有用的)。)
或者如果你希望字面部分完全出现。
^[^A\r\n]*+(?>A[^A\r\n]*)*?Ap oS.*
你不需要使用lookahead,因为这就是勉强量化器在这里做的事情(它在每次分组迭代后测试下一个子模式)。
需要注意的是,由于你要寻找的是包含字面字符串的行,如果你的数据来自一个文件,那么在许多编程语言中,简单地逐行读取文件并使用基本的字符串函数进行过滤可能更有趣。
根据pcre中默认的换行序列和你的字符串中使用的序列。.*
匹配回车。为了避免这种行为,你可以明确地设置换行顺序,在你的模式中以 (*CRLF)
.
减少模式的步骤数是提高模式效率的方法之一,但要注意不要只为此目的建立一个太长或太复杂的模式,因为这也会产生反作用。