我们正在考虑从PCRE转向PCRE2作为我们的内部regex引擎。只有regex语法本身公开给我们的用户,所以库API的差异不是我们使用的问题。然而,我们必须记录任何行为的变化。
很多网站都在讨论API的不同之处,但我还没有在regex符号中找到任何列出实际差异的网站。虽然我知道[\w-_]
的意思与[\w\-_]
在PCRE中的意思相同,但实际上是invalid in PCRE2,但我怀疑还存在其他的差异。
在PCRE2的正则表达式与PCRE的正则表达式有什么不同?
发布于 2022-09-19 02:00:57
PCRE v8.36与PCRE2 10.39编译后的差异
我已经编译了一个列表,这些更改是从pcre转换到pcre2时可能遇到的问题。我已经排除了在pcre中模式可能遇到的各种溢出、潜流、分段违规和各种错误。
Pcre2有一个版本检查模式。您可以在与"yesno“匹配的/(?(VERSION>=10)yes|no)/
应用程序中检查该版本。
可能发生的重大变化:
/()a/
等模式未能设置“第一个字符必须是'a'”信息。例如,/(?:(?=.)|(?<!x))a/
。/a\K.(?0)*/
与"abac”匹配的模式就会找到"bac“。\K
的效果没有得到正确的传播。并非所有\K
的使用都会产生错误的结果。(*ACCEPT)
没有取消其他组捕获,只留下包含不正确信息的排卵器。例如,/(x)|((*ACCEPT))/
与"abcd“匹配。/(?i)[A-`]/
模式和混合情况的模式,可以将范围保留在类之外,在这种情况下,and被排除在外。(*FAIL)
进行优化的断言。例如,(?(?!)a|b)
。\8
和\9
,现在匹配Perl。它们要么是后面的引用,要么是字面字符"8“和"9”。(?'')
)的错误。/^(?:(?(1)x|)+)+$()/.
\p
和\P
时不会报告错误。/(?(R))*+/
。[[:punct:]b]
这样的序列将忽略POSIX类。[:punct:]
匹配128-255中不应该匹配的字符.[^[:^ascii:]\d]
)和非否定类(如[:^ascii:]
或[:^xdigit:]
)不正确地包含大于255个的所有代码点。(?imsxJU)
选项不再传输到PCRE2_INFO_ALLOPTIONS返回的选项。\Q\E
放在量词(如A+\Q\E+ )的中间,现在被忽略了。\Q\E
序列,但是它将被忽略。{0}
。(?(DEFINE)...)
视为一个“定义”组,即使存在一个名为"define“的组。(?(R2)...)
。(?(R)...)
。(?=.*X)X$
这样的模式被错误地优化,就好像它们需要一个初始的'X‘和后面的'X’一样。.*
开头的断言被错误地优化,要求在主题的开头或换行符之后进行匹配。有些情况不是真的,例如(?=.*[A-Z])(?=.{8,16})(?!.*[\s])
。/(?(1)^())b/ or /(?(?=^))b/
。/(?&xxx)*ABC(?<xxx>XYZ)/
会期望'A‘是第一个字符。https://stackoverflow.com/questions/70273084
复制相似问题