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
.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 字符 (≥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
,根据字符串的内部存储格式,生成与字符≥
0x100
相同的chr(ord($char) ^ 0x40)
或相同的总垃圾。
-