Java中的字符串转义符 "\\"
Java中的字符串转义符 "\\"
下面的单元测试能够通过,这可能不符合直觉。
原因在于"\"在这里被JVM解释为转义符,所以如果当你需要一个"\",在Java里面同时需要为JVM提供一个"\"用于转义,这样你就得到了一个字符"\\"。
进一步的可以做一个小实验,在用户UI中输入字符"\abc",调试模式用该字符初始化的Java变量其实是"\\abc",当你把这个字符输出到文件或者保存到数据库中时,我们看到的是"\abc".
给定一个表达式:
foobar~='^.*a[b-f]g.*$',
我们不想让其中正则表达式生效(本意是想让诸如mvel这样的语言解释器,将[b-f]按照字面意义上去读入),这样的话,前面表达式如果存在数据库中,似乎是这样:
foobar ~='^.*a\\[b-f\\]g.*$'
进一步的,在Java代码中将表达式赋值给一个变量,看起来应该是这个样子
下面的单元测试能够通过,这可能不符合直觉。
@Test public void passed() { String a = "\\"; assertFalse(a.length() == 2); assertTrue(a.length() == 1); String b = "\\\\"; assertTrue(b.length() == 2); }
原因在于"\"在这里被JVM解释为转义符,所以如果当你需要一个"\",在Java里面同时需要为JVM提供一个"\"用于转义,这样你就得到了一个字符"\\"。
进一步的可以做一个小实验,在用户UI中输入字符"\abc",调试模式用该字符初始化的Java变量其实是"\\abc",当你把这个字符输出到文件或者保存到数据库中时,我们看到的是"\abc".
给定一个表达式:
foobar~='^.*a[b-f]g.*$',
我们不想让其中正则表达式生效(本意是想让诸如mvel这样的语言解释器,将[b-f]按照字面意义上去读入),这样的话,前面表达式如果存在数据库中,似乎是这样:
foobar ~='^.*a\\[b-f\\]g.*$'
进一步的,在Java代码中将表达式赋值给一个变量,看起来应该是这个样子
String expression = "foobar~='^.*a\\\\[b-f\\\\]g.*$'";