用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);