Java 正则表达式 cx(控制字符)



Javadoc for java.util.regex.Pattern 表示 cx 表示对应于 x 的控制字符。所以我认为Pattern.compile()会拒绝一个c后跟除[@-_]以外的任何角色,但事实并非如此!

正如@tchrist评论的那样 什么是控制字符的正则表达式?的答案之一,根本不检查范围。我测试了来自更高块和星光平面的几个字符,看起来它只是翻转了代码点值的第 7 低位。

那么它是一个Javadoc错误还是一个实现错误,或者我误解了什么?cx是Java发明的语法,还是其他正则表达式引擎(尤其是Perl(支持它?那里是如何处理的?

所有版本的 Perl 对于以下转义的行为都相同:

  • c后跟 ASCII 大写字母或 @[]^_? 之一时,

    chr(ord($char) ^ 0x40)

    这提供了所有 ASCII 控制字符 ( 0x00 .0x1F0x7F(。

    c@ === x00
    cA === x01
    ...
    cZ === x1A
    c[ === x1B
    c === x1C   # Sometimes c\ is needed.
    c] === x1D
    c^ === x1E
    c_ === x1F
    c? === x7F
    
  • c后跟 ASCII 小写字母时,

    chr(ord($char) ^ 0x60)

    这使得转义不区分大小写。

    ca === cA === x01
    ...
    cz === cZ === x1A
    

没有其他序列有意义,但错误检查仅在 Perl 5.20 中引入。

  • ≥5.20,

    • c后跟空格、ASCII 数字或!"#$%&'()*+,-./:;<=>{|}~之一时,

      chr(ord($char) ^ 0x40),但警告(is more clearly written simply as(。

    • c后跟 ASCII 控制字符 ( 0x00 ..0x1F0x7F ( 或非 ASCII 字符 (≥ 0x80 (,

      致命错误Character following "c" must be printable ASCII

  • <5.20,>

    • c后跟空格、ASCII 数字、!"#$%&'()*+,-./:;<=>{|}~之一或 ASCII 控制字符 ( 0x00 .0x1F0x7F (,

      chr(ord($char) ^ 0x40)

    • c后跟字符≥ 0x100时,

      垃圾总量(chr(ord(substr(encode_utf8($char, 0, 1)) ^ 0x40) . encode_utf8($char, 1)(。

    • c后跟字符0x80时..0xFF

      根据字符串的内部存储格式,生成与字符≥ 0x100相同的chr(ord($char) ^ 0x40)或相同的总垃圾。

最新更新