PHP Conference Japan 2024

Perl 差异

此处描述的差异是相对于 Perl 5.005 的。

  1. 默认情况下,空格字符是 C 库函数 isspace() 识别的任何字符,尽管可以使用替代字符类型表编译 PCRE。通常,isspace() 匹配空格、换页符、换行符、回车符、水平制表符和垂直制表符。Perl 5 不再在其空格字符集中包含垂直制表符。Perl 文档中长期存在的 \v 转义符实际上从未被识别过。但是,该字符本身至少在 5.002 之前被视为空格。在 5.004 和 5.005 中,它与 \s 不匹配。
  2. PCRE 不允许在先行断言上使用重复限定符。Perl 允许它们,但它们的意思并非您想象的那样。例如,(?!a){3} 不会断言接下来的三个字符不是“a”。它只是断言下一个字符不是“a”三次。
  3. 捕获的子模式出现在否定先行断言中时会被计数,但它们在偏移量向量中的条目永远不会被设置。Perl 从任何此类模式中设置其数值变量,这些模式在断言未能匹配某些内容(从而成功)之前匹配,但前提是否定先行断言仅包含一个分支。
  4. 尽管主体字符串中支持二进制零字符,但在模式字符串中不允许它们,因为它是作为正常的 C 字符串传递的,以零结尾。转义序列“\x00”可用于模式中表示二进制零。
  5. 以下 Perl 转义序列不受支持:\l、\u、\L、\U。事实上,这些是由 Perl 的通用字符串处理实现的,而不是其模式匹配引擎的一部分。
  6. Perl \G 断言不受支持,因为它与单个模式匹配无关。
  7. 很明显,PCRE 不支持(?{code}) 和 (??{code}) 结构。但是,支持递归模式。
  8. 在撰写本文时,Perl 5.005_02 中存在一些与模式的一部分重复时捕获字符串的设置相关的奇异之处。例如,将“aba”与模式/^(a(b)?)+$/匹配将 $2 设置为值“b”,但将“aabbaa”与/^(aa(bb)?)+$/匹配将使 $2 未设置。但是,如果模式更改为/^(aa(b(b))?)+$/,则 $2(和 $3)将被设置。在 Perl 5.004 中,这两种情况下 $2 都会被设置,并且 PCRE 也为true。如果将来 Perl 更改为不同的稳定状态,PCRE 可能会随之更改。
  9. 另一个尚未解决的差异是,在 Perl 5.005_02 中,模式/^(a)?(?(1)a|b)+$/ 与字符串“a”匹配,而在 PCRE 中则不匹配。但是,在 Perl 和 PCRE 中,/^(a)?a/ 与“a”匹配后,$1 未设置。
  10. PCRE 为 Perl 正则表达式功能提供了一些扩展

    1. 尽管后顾断言必须匹配固定长度的字符串,但后顾断言的每个备选分支可以匹配不同长度的字符串。Perl 5.005 要求它们都具有相同的长度。
    2. 如果设置了PCRE_DOLLAR_ENDONLY 并且未设置PCRE_MULTILINE,则 $ 元字符仅匹配字符串的绝对末尾。
    3. 如果设置了PCRE_EXTRA,则反斜杠后跟一个没有特殊含义的字母将出错。
    4. 如果设置了PCRE_UNGREEDY,则重复限定符的贪婪性将被反转,即默认情况下它们不是贪婪的,但如果后面跟着一个问号,则它们是贪婪的。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top