用Regex替换双引号的单引号

时间:2013-06-09 11:48:04

标签: java regex

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

{'username' : 'xirby'}

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

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

  • 单引号出现在带有一个或多个空格的{之后
  • 来自一个或多个空格:
  • 追加:再增加一个空格
  • 来自一个或多个空格}

所以这个字符串{'username' : 'xirby'}

{  'username' : 'xirby'  }

将转变为:

{"username" : "xirby"}

更新

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

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

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

7 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

\s*\'\s*

并且调用替换为"将完成此任务。请看here

答案 1 :(得分:2)

最好不要使用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

答案 2 :(得分:2)

此正则表达式将捕获所有适当的单引号和关联的空格,同时忽略消息中的单引号。可以用双引号替换捕获的字符,同时保留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"}'

此方法使用预读和后视操作在符号{},:旁边查找单引号。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

关于您的问题标签是 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+"]}

答案 6 :(得分:-1)

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

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