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

5 java regex perl control-characters

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

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

那么它是一个Javadoc错误还是一个实现错误,还是我误解了什么?是\cxJava发明的语法还是其他正则表达式引擎支持,尤其是Perl?怎么处理?

ike*_*ami 6

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

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

    chr(ord($char) ^ 0x40)

    这提供了对所有ASCII控制字符(0x00.. 0x1F,0x7F)的完全覆盖.

    \c@ === \x00
    \cA === \x01
    ...
    \cZ === \x1A
    \c[ === \x1B
    \c\ === \x1C   # Sometimes \c\\ is needed.
    \c] === \x1D
    \c^ === \x1E
    \c_ === \x1F
    \c? === \x7F
    
    Run Code Online (Sandbox Code Playgroud)
  • \c后跟一个ASCII小写字母,

    chr(ord($char) ^ 0x60)

    这使得逃逸不区分大小写.

    \ca === \cA === \x01
    ...
    \cz === \cZ === \x1A
    
    Run Code Online (Sandbox Code Playgroud)

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

  • ≥5.20,

    • \c后面的空间中,一个ASCII数字或之一!"#$%&'()*+,-./:;<=>{|}~,

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

    • 如果\c后跟ASCII控制字符(0x00.. 0x1F,0x7F)或非ASCII字符(≥ 0x80),

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

  • <5.20,

    • \c后面的空间中,一个ASCII位的一个中的一个!"#$%&'()*+,-./:;<=>{|}~或一个ASCII控制字符(0x00.. 0x1F,0x7F),

      chr(ord($char) ^ 0x40)

    • \c后面跟着人物≥ 0x100,

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

    • 什么时候\c跟字符0x80.. 0xFF,

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