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

时间:2016-02-04 18:16:22

标签: java regex perl control-characters

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

正如@tchrist对What is a regular expression for control characters?的答案之一所评论的那样,范围根本没有检查。我从较高的块和星界平面测试了几个字符,看起来它只是翻转了码点值的第7个最低位。

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

1 个答案:

答案 0 :(得分:6)

所有版本的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字符(≥{{1 }}),

      致命错误0x80

  • &LT; 5.20,

    • Character following "\c" must be printable ASCII后跟一个空格,一个ASCII数字,\c之一或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)相同的总垃圾。