我想知道为以下字符提供特殊正则表达式构造的原因是什么:
\t
- 制表符('\ u0009')
\n
- 换行符(换行符)('\ u000A')
\r
- 回车符('\ u000D')
\f
- 换页符('\ u000C')
,另一方面,没有为退格字符(\b
)提供一个。
如this question中所示,“\\n
”与“\n
”或“\\t
”相比“\t
”与“Pattern.COMMENTS
相比肯定存在差异“,当使用Pattern.COMMENTS
标志时,但我认为它没有回答这个问题,为什么没有正则表达式构造用于退格字符。
对于退格字符的正则表达式构造是否有任何可能的用例,不仅在item.check
标志设置为活动时,而且在其他情况下我还不知道?为什么退格字符被认为与上面列出的其他空格字符不同,导致决定不为退格字符提供正则表达式构造?
答案 0 :(得分:1)
Java正则表达式源于Perl正则表达式,其中大多数速记类已经被定义。由于Perl正则表达式用户习惯于使用"\\b"
作为已经接受的词边界变化和众所周知的缩写。 Perl正则表达式中的"\\b"
匹配单词边界,它带有Java正则表达式的含义。见Java regex documentation:
例如,字符串文字
"\b"
在解释为正则表达式时匹配单个退格字符,而"\\b"
与字边界匹配。
目前,你甚至不能让"\\b"
充当字符集中的退格(如在其他一些语言中,例如在Python中),它专门用于在编写模式时避免人为错误。根据最新规格
在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些保留用于将来对正则表达式语言的扩展。
如果 使用正则表达式转义为退格键,请使用Unicode正则表达式转义"\\u0008"
:
String s = "word1 and\bword2";
System.out.println(Arrays.toString(s.split("\\b"))); // WB
// => [word1, , and, , word2]
System.out.println(Arrays.toString(s.split("\b"))); // BS
// => [word1 and, word2]
System.out.println(Arrays.toString(s.split("[\b]"))); // BS in a char set
// => [word1 and, word2]
System.out.println(Arrays.toString(s.split("\\u0008"))); // BS as a Unicode regex escape
// => [word1 and, word2]
System.out.println(Arrays.toString(s.split("[\\b]")));// WB NOT treated as BS in a char set
// => java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 2