Java中转义字符反斜杠\的代替方法及repalceAll内涵解析
一、需求
现有一个字符串str
Stringstr="{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}"; System.out.println("str="+str);
在控制台的输出为:
str={\"name\":\"spy\",\"id\":\"123456\"}
目标:将str转化为标准的json格式串str1,以调用JsonUtil的方法,将字符串转为map。即目标str1为:
str1={"name":"spy","id":"123456"}
二、实现方法
1.使用StringEscapeUtils中的转义与反转义
apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils。利用它可方便地进行html、xml、java等的转义与反转义。
Stringstr="{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}"; System.out.println("原始str="+str); Stringstr1=StringEscapeUtils.unescapeJava(str); System.out.println("目标str1="+str1); //对应方法的StringEscapeUtils.escapeJava(str1); //可将str1转义回str
控制台输出:
原始str={\"name\":\"spy\",\"id\":\"123456\"}
目标str1={"name":"spy","id":"123456"}
2.使用Java的replaceAll方法
Stringstr1=str.replaceAll("\\\\",""); //控制台str1的输出为:{"name":"spy","id":"123456"}
三、Java的replaceAll内涵解析
使用Java的replaceAll(Stringregex,Stringreplacement)函数,即用replacement替换所有的regex匹配项,regex是一个正则表达式,replacement是字符串。
Stringstr="{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
(1)对于串str,Java将其进行转义,\\表示\,\”表示”,故而在Java内存中即为:
{\”name\”:\”spy\”,\”id\”:\”123456\”},然而,我们的目标是{“name”:”spy”,”id”:”123456”},即将转义字符\替换为空。
(2)Java的replaceAll(Stringregex,Stringreplacement)函数,第一个参数是一个正则表达式。在正则表达式中的“\”与后面紧跟的那个字符构成一个转义字符,代表着特殊的意义,比如”\n”表示换行符等。所以,如果要在正则表达式中表示一个反斜杠\,则应当用\\表达。但参数regex首先会经过Java的一次转义,若想表达两个反斜杠\\,则需四个反斜杠。
综上所述:replaceAll的第一个参数是正则表达式,故而要经过两次转义,一次Java、一次正则。因此就需要四个反斜杠才可以匹配一个反斜杠。故而,替换一个反斜杠为空的replaceAll的代码即为:
str1=str.replaceAll("\\\\","");
四、补充说明
String的replaceAll同Matcher.replaceAll.如下是String的repalceAll的源码实现。
publicStringrepalceAll(Stringexpr,Stringsubstitute){ returnPattern.compile(expr).matcher(this).replaceAll(substitute); }
大家可以注意到Pattern.compile(expr)的参数是正则表达式。故而:
错误写法(运行报错):
Stringtmp=Pattern.compile("\\").matcher("h\\").replaceAll("ello");
正确写法:
Stringtmp=Pattern.compile("\\\\").matcher("h\\").replaceAll("ello"); //输出为hello
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。