Java 用正则表达式将单引号替换为双引号

Java 用正则表达式将单引号替换为双引号,java,regex,Java,Regex,我有一个应用程序收到格式错误的JSON字符串,如下所示: {'username' : 'xirby'} 我需要将单引号“替换为双引号” 根据这些规则(我认为): 单个引号位于{后面,带有一个或多个空格 位于一个或多个空格之前,并且: 在一个:后面加一个空格 位于一个或多个空格之前,并且} 所以这个字符串{'username':'xirby'}或者 { 'username' : 'xirby' } 将转变为: {"username" : "xirby"} 更新: 还有一个可能格式错误

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

{'username' : 'xirby'}
我需要将单引号
替换为双引号

根据这些规则(我认为):

  • 单个引号位于
    {
    后面,带有一个或多个空格
  • 位于一个或多个空格之前,并且
  • 在一个
    后面加一个空格
  • 位于一个或多个空格之前,并且
    }
所以这个字符串
{'username':'xirby'}
或者

{  'username' : 'xirby'  }
将转变为:

{"username" : "xirby"}
更新:

还有一个可能格式错误的JSON字符串:

{  'message' : 'there's not much to say'  }
在本例中,不应替换消息值中的单引号。

请尝试以下正则表达式:

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

调用Replace为
即可完成此任务。看看。

与其这样做,不如使用JSON解析器,它可以读取这种格式错误的JSON并为您“规范化”它。我们可以这样做:

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)?匹配一个或零个空格字符。

我建议您使用JSON解析器而不是正则表达式

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

此正则表达式将捕获所有适当的单引号和关联的空格,同时忽略消息中的单引号。可以用双引号替换捕获的字符,同时保留JSON格式。它还泛化为包含多条消息的JSON字符串(由逗号分隔)


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

首先导入库:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
然后:


不要使用正则表达式,请参见我的answer@flav我对replaceAll的担心是,它可能会将内部的单引号替换为单引号text@xybrek因此,需要使用适当的JSON解析器…正则表达式只能做到这一点,即使在值中只有一个引号,它也能很好地工作。例如:{'name':“man's”}
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"}'
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+"]}