为什么没有特殊的正则表达式构造用于退格字符(“\ b”),例如Java中的\\ t,\\ n,\\ r和\\ f?

时间:2018-02-28 13:41:22

标签: java regex

我想知道为以下字符提供特殊正则表达式构造的原因是什么:

\t - 制表符('\ u0009')

\n - 换行符(换行符)('\ u000A')

\r - 回车符('\ u000D')

\f - 换页符('\ u000C')

,另一方面,没有为退格字符(\b)提供一个。

this question中所示,“\\n”与“\n”或“\\t”相比“\t”与“Pattern.COMMENTS相比肯定存在差异“,当使用Pattern.COMMENTS标志时,但我认为它没有回答这个问题,为什么没有正则表达式构造用于退格字符。

对于退格字符的正则表达式构造是否有任何可能的用例,不仅在item.check标志设置为活动时,而且在其他情况下我还不知道?为什么退格字符被认为与上面列出的其他空格字符不同,导致决定不为退格字符提供正则表达式构造?

1 个答案:

答案 0 :(得分:1)

Java正则表达式源于Perl正则表达式,其中大多数速记类已经被定义。由于Perl正则表达式用户习惯于使用"\\b"作为已经接受的词边界变化和众所周知的缩写。 Perl正则表达式中的"\\b"匹配单词边界,它带有Java正则表达式的含义。见Java regex documentation

  

例如,字符串文字"\b"在解释为正则表达式时匹配单个退格字符,而"\\b"与字边界匹配。

目前,你甚至不能让"\\b"充当字符集中的退格(如在其他一些语言中,例如在Python中),它专门用于在编写模式时避免人为错误。根据最新规格

  

在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些保留用于将来对正则表达式语言的扩展。

如果 使用正则表达式转义为退格键,请使用Unicode正则表达式转义"\\u0008"

Java online demo

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