5 java regex perl control-characters
Javadoc for java.util.regex.Patternsay \cx表示与x对应的控制字符.所以我认为Pattern.compile()会拒绝一个\c跟随除了之外的任何角色[@-_],但事实并非如此!
正如@tchrist 对控制字符的正则表达式的答案之一所评论的那样?,范围根本没有检查.我测试了来自更高块和星界平面的几个字符,看起来它只是翻转码点值的第7个最低位.
那么它是一个Javadoc错误还是一个实现错误,还是我误解了什么?是\cxJava发明的语法还是其他正则表达式引擎支持,尤其是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
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.
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |