关于java的转义字符我一直有疑问。之前都没有仔细研究过,模糊的用过。今天刚好有时间就仔细研究了下。
下面是一段后台返回的json字符串:
String jsonStr="{\\\"爆发训练(休息8s)\\\":\\\"24次,3组\\\",\\\"初级肌力(休息7s)\\\":\\\"14次,2组\\\"}"
这样一段的字符串需要解析出来。首先我们需要把转义的\去掉。然后才能转换成JOSNObject.
这一段字符串打印输出以后是这样:
{\"爆发训练(休息8s)\":\"24次,3组\",\"初级肌力(休息7s)\":\"14次,2组\"}
我刚开始会很纳闷,\\\"怎么转义到只剩下\"了,其实我们只需要从后忘前看,\"转义后是",\\转义以后是\,所以最后就是\";
举个栗子:String test = "aaaa\\\\\"bbbb\\\\\\";输出就是aaaa\\"bbbb\\\;
我们需要把jsonStr串转换成标准的json字符串我们可以使用String的replaceAll方法。
使用Java的replaceAll(String regex, String replacement)函数,
即用replacement替换所有的regex匹配项,regex是一个正则表达式,replacement是字符串。
(1)对于串jsonStr,Java将其进行转义,\\ 表示 \ ,\" 表示 " ,所以我们真正的字符串应该是
{\"爆发训练(休息8s)\":\"24次,3组\",\"初级肌力(休息7s)\":\"14次,2组\"},然而,
我们的目标是 {"爆发训练(休息8s)":"24次,3组","初级肌力(休息7s)":"14次,2组"},
即将转义字符 \ 替换为空。
(2)Java的replaceAll(String regex, String replacement)函数,第一个参数是一个正则表达式。
在正则表达式中的\与后面紧跟的那个字符构成一个转义字符,代表着特殊的意义,比如"\n"表示换行符等。
所以,如果要在正则表达式中表示一个反斜杠\,则应当用\\表达 。但参数regex 首先会经过Java的一次
转义,若想表达两个反斜杠 \\,则需四个反斜杠。
综上所述:replaceAll 的第一个参数是正则表达式,故而要经过两次转义,一次Java、一次正则。
因此就需要四个反斜杠才可以匹配一个反斜杠。故而,替换一个反斜杠为空的replaceAll的代码即为:
String s = jsonStr.replaceAll("\\\\", "");
综上所述。如果需要用正则表达式匹配出两个反斜杠:则需要8个\.
再次举个栗子:String test="\\\\\\abc";其真实的字符串是\\\abc;我们要去掉其中的\。我们需要12个\吗??no.我们只需要匹配一个。然后全部替换掉就好了。即test.replaceAll("\\\\");就可以输出abc了。
当然,我们也可以使用replace(CharSequence target, CharSequence replacement);这个就不需要经过正则表达式的转义了。只需要Java的一层转义就好了。即 String replace = jsonStr.replace("\\", "");
输出:{"爆发训练(休息8s)":"24次,3组","初级肌力(休息7s)":"14次,2组"}
剩下的就是Josn解析了。