问题描述
一个很简单的json串:String json = "{"name1":"value1","na"me2":"va"lue2"}";问题是:现在key和value的值中都有可能出现双引号,需要将key或value中值的双引号(不管中间有多少个双引号都替换,边界的不能替换)替换味单引号;现在 json= json.replaceAll(""(\w*)"(\s*:\s*)", "'$1'$2"); json= json.replaceAll("(\s*:\s*)"(\w*)"", "$1'$2'");都达不到要求....替换成功打印到控制台后希望是:{"name1":"value1","na'me2":"va'lue2"}
解决方案
json = json.replaceAll(""", "'").replaceAll("([\{\:\,])'", "$1"").replaceAll("'([\}\:\,])", ""$1");
解决方案二:
上面还是写错了!好像忘记匹配多个“了这个就对了public static void main(String[] args) {String json = "{"name1":"value1","na"me2":"va"l"u"e2"}"; System.out.println(json);Pattern p = Pattern.compile("(?<=(\{|,|:)").*?(?="(:|,|\}))");Matcher m = p.matcher(json);while(m.find()){String tmp = m.group();json = json.replaceAll(tmp, tmp.replaceAll(""","'"));}System.out.println(json);}
解决方案三:
上面写错了点json = json.replaceAll("(?<=(\{|,|:)"\w{1,100})"(?=\w+"(:|,|\}))","'");
解决方案四:
一个效率不太高的方法:String json = "{"name1":"value1","na"me2":"va"lue2"}";Pattern p = Pattern.compile("\w+(")\w+"); Matcher m = p.matcher(json); // 获得匹配器对象 while (m.find()) { json=json.replace(m.group(),m.group().replaceAll(""","")); } System.out.println(json);
解决方案五:
写了半天,老报错,负向断言的时候里面不能用.*?贪婪匹配 (希望有人能告诉我为什么) 用的.(1,Integer.MAX_VALUE-1)?进行贪婪匹配Pattern p = Pattern.compile("(?<=(\{|,|:)"(.{1,"+(Integer.MAX_VALUE-1)+"}?))"(?=.+?"(:|,|\}))");
解决方案六:
如果每个key或者value中只有连续出现的 " 一次或多次,就更简单json = json.replaceAll("(\w+)"+(\w+)", "$1'$2");
解决方案七:
不一定要用正则表达式嘛,反正我写不出来,我倒是有个思路可以解决!1.替换字符中的所有空格字符串为非空格解决"name":"value1","na"me2":"value2","name3" : " value3 "解决空格问题;2.用正则表达式将字符分组String reg="(":"\b|","\b)";String[] arr=s.split(reg);3.循环查找替换arr[i]中"字符不在开头或者结尾的字符!