用Regex替换双引号的单引号

我有一个应用程序收到格式错误的JSON字符串,如下所示:

{'username' : 'xirby'} 

我需要用双重替换单引号'

有了这些规则(我认为):

  • 单引号出现在{带有一个或多个空格之后
  • 来自一个或多个空间并且:
  • 来自:再多一个空间
  • 来自一个或多个空格和}

所以这个String {'username' : 'xirby'}或者

 { 'username' : 'xirby' } 

将转变为:

 {"username" : "xirby"} 

更新:

也可能是格式错误的JSON字符串:

 { 'message' : 'there's not much to say' } 

在此示例中,不应替换消息值内的单引号。

试试这个正则表达式:

 \s*\'\s* 

并且打电话给替换"将完成工作。请看这里 。

此正则表达式将捕获所有适当的单引号和相关的空格,同时忽略消息中的单引号。 可以用双引号替换捕获的字符,同时保留JSON格式。 它还推广到具有多个消息的JSON字符串(以逗号分隔)。

 ((?<={)\s*\'|(?<=,)\s*\'|\'\s*(?=:)|(?<=:)\s*\'|\'\s*(?=,)|\'\s*(?=})) 

我知道你为java标记了你的问题,但我对python更熟悉。 这是一个如何在python中用双引号替换单引号的示例:

 import re regex = re.compile('((?<={)\s*\'|(?<=,)\s*\'|\'\s*(?=:)|(?<=:)\s*\'|\'\s*(?=,)|\'\s*(?=}))') s = "{ 'first_name' : 'Shaquille' , 'lastname' : 'O'Neal' }" regex.sub('"', s) > '{"first_name":"Shaquille","lastname":"O\'Neal"}' 

此方法使用前瞻和后视操作查找符号{},:旁边的单引号。

 String test = "{'username' : 'xirby'}"; String replaced = test.replaceAll("'", "\""); 

而不是这样做,你最好使用JSON解析器,它可以读取这种格式错误的JSON并为你“规范化”它。 jackson可以这样做:

 final ObjectReader reader = new ObjectMapper() .configure(Feature.ALLOW_SINGLE_QUOTES, true) .reader(); final JsonNode node = reader.readTree(yourMalformedJson); // node.toString() does the right thing 

如果您希望完全满足所有这些条件,请尝试以下方法:

 '{(\s)?\'(.*)\'(\s)?:(\s)?\'(.*)\'(\s)?}' 

正如你的正则表达式 它使用(\ s)? 匹配一个或零个空白字符。

关于你的问题的标签是JAVA ,我在JAVA中回答。

首先导入库:

 import java.util.regex.Matcher; import java.util.regex.Pattern; 

然后:

 Pattern p = Pattern.compile("((?<=(\\{|\\[|\\,|:))\\s*')|('\\s*(?=(\\}|(\\])|(\\,|:))))"); String s = "{ 'firstName' : 'Malus' , 'lastName' : ' Ms'Malus' , marks:[ ' A+ ', 'B+']}"; String replace = "\""; String o; Matcher m = p.matcher(s); o = m.replaceAll(replace); System.out.println(o); 

输出:

 {"firstName":"Malus","lastName":" Ms'Malus", marks:[" A+ ","B+"]} 

我建议您使用JSON解析器而不是REGEX。

 String strJson = "{ 'username' : 'xirby' }"; strJson = new JSONObject(strJson).toString(); System.out.println(strJson);