java.util.regex.Pattern
的Javadoc表示\cx
代表与x 对应的控制字符。所以我认为Pattern.compile()
会拒绝\c
后面跟[@-_]
以外的任何字符,但事实并非如此!
正如@tchrist对What is a regular expression for control characters?的答案之一所评论的那样,范围根本没有检查。我从较高的块和星界平面测试了几个字符,看起来它只是翻转了码点值的第7个最低位。
这是一个Javadoc错误还是一个实现错误,还是我误解了什么? \cx
是Java发明的语法还是其他正则表达式引擎支持,尤其是Perl?那是怎么处理的?
答案 0 :(得分: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
当\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
.. 0x1F
,0x7F
)或非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)
相同的总垃圾。