项目中需要解析的键值对格式如下:
String body = "jsondata[username]=xiaoming&jsondata[password]=12345";
然后我把没用的信息去除掉,好用于直接转成对象,然后用replaceAll:
body = body.replaceAll("jsondata[","").replaceAll("]=","=");
运行报错了:
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 8
jsondata[
^
at java.util.regex.Pattern.error(Pattern.java:1957)
at java.util.regex.Pattern.clazz(Pattern.java:2550)
at java.util.regex.Pattern.sequence(Pattern.java:2065)
at java.util.regex.Pattern.expr(Pattern.java:1998)
at java.util.regex.Pattern.compile(Pattern.java:1698)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.replaceAll(String.java:2223)
at com.leetcode.daycode.TestReplace.main(TestReplace.java:9)
原来replaceAll用的是正则匹配,[ ]在正则中时用于分组的,所以加上了转义
body = body.replaceAll("jsondata\\[","").replaceAll("\\]=","=");
可以了,替换后:
username=xiaoming&password=12345
后来项目用SonarLint扫描,提示这里只接用replace就可以,查了下原来replace也可以替换所有(原来以为replace只替换一个,replace替换所有,替换一个还有replaceFirst方法)
然后就直接用了replace,也没有测试代码
body = body.replace("jsondata\\[","").replace("\\]=","=");
后来测试反馈这里运行有问题,debug才发现replace用的不是正则,直接是字符串,然后原来的转义变为\了,所以替换不成功了
把转义去掉就OK了
就记录一下,有时候简单的方法不要想当然,还是要自己验证下