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