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