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

问题描述 投票:3回答:1

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

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

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

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

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

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

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

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

java regex
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.