如果字符串没有转义并且值存储在属性文件中,java编译器是否会自动添加转义字符?
例如,以下语句由于\W字符而生成编译器错误:
testRegex ="[ t]*(NotWknown)[ \t]*";
但是,如果我将该字符串存储在属性文件中并按原样加载,编译器不会抱怨。
app.properties
regex.expr = [ t]*(NotWknown)[ \t]*
MyClass.java
testRegex = System.getProperty("regex.expr");
编译器是否自动转义\W值?
读取属性文件时,将应用以下规则。这是来自属性类的Javadoc
键和元素中的字符可以用转义序列表示,类似于用于字符和字符串文字的转义序列(请参阅Java™语言规范)。与用于字符和字符串的字符转义序列和Unicode转义的区别在于:
- 无法识别八进制转义
- 字符序列\b不代表退格字符
- 该方法不将无效转义符之前的反斜杠字符\视为错误;反斜杠被静默地删除。例如,在Java字符串中,序列"\z"会导致编译时错误。相反,此方法静默地删除反斜杠。因此,此方法将两个字符序列"\b"视为等效于单个字符"b">
- 单引号和双引号不需要转义符;但是,根据上面的规则,前有反斜杠的单引号字符和双引号字符仍然分别产生单引号和双引号
- Uniocde转义序列中只允许有一个"u"字符
因此,在您站点的示例中,W
将被视为只是W
。但这与编译器无关。这些规则在运行时应用。
转义符仅在String
文字值和char
文字值中是必需的,因为它们是由编译器解析的。如果String
是从其他来源读取和创建的,则没有必要。
来自Java语言规范
字符和字符串转义序列允许表示一些非图形字符以及单引号、双引号字符文字中的引号和反斜杠字符(§3.10.4)以及字符串文字(§3.10.5)。