小编典典
@Peter
Lawrey的答案描述了力学。“问题”是反斜杠在Java字符串文字和正则表达式的迷你语言中都是转义字符。因此,当您使用字符串文字来表示正则表达式时,要考虑两组转义…取决于正则表达式的含义。
但是为什么会这样呢?
这是历史性的事情。Java最初根本没有正则表达式。Java String文字的语法规则是从C / C 借用的,C / C也没有内置的正则表达式支持。直到他们Pattern在Java 1.4
中以类的形式添加了regex支持之后,双重转义的尴尬才在Java中变得显而易见。
那么其他语言如何避免这种情况呢?
它们通过 在编程语言本身中
为正则表达式提供直接或间接的语法支持来实现。例如,在Perl,Ruby,Javascript和许多其他语言中,存在模式/正则表达式的语法(例如’/
pattern
/’),其中字符串文字转义规则不适用。在C#和Python中,它们提供了替代的“原始”字符串文字语法,其中反斜杠不能转义。(但是请注意,如果您使用普通的C#/
Python字符串语法,则会遇到Java双重转义的问题。)
为什么text.replaceAll("\n","/"),text.replaceAll("\\n","/")以及
text.replaceAll("\\\n","/")所有给予相同的输出?
第一种情况是字符串级别的换行符。Java regex语言将所有非特殊字符视为自己匹配。
第二种情况是反斜杠,其后是字符串级别的“ n”。Java regex语言将反斜杠解释为后跟“ n”的换行符。
最后一种情况是在字符串级别使用反斜杠后跟换行符。Java
regex语言无法将其识别为特定的(regex)转义序列。但是,在正则表达式语言中,反斜杠后跟任何非字母字符表示后者。因此,反斜杠后跟换行符…的含义与换行符相同。
2020-09-09