正则表达式匹配无效的JSON字符串

时间:2013-07-02 15:49:47

标签: regex json

我想使用正则表达式搜索来匹配包含名称不在引号中的名称/值对的无效JSON。例如:

无效(我正在尝试匹配此内容):

{name:"value"}

有效(我会修复它们看起来像这样):

{"name":"value"}

我可以使用什么RegEx来最佳匹配包含“”双引号的对象键? (单引号可以匹配,因为我还是希望将它们转换为双引号)。

4 个答案:

答案 0 :(得分:2)

通常在正则表达式中,当您想要指出not时,您使用^字符。例如,在示例中,匹配除引号之外的任何内容的正则表达式字符串将如下所示:

r'\{[ \t]+[^\"]*[a-zA-Z]+[^\"][ \t]+:'

当然,在许多情况下,这可能会失败,因为正则表达式不是解决此问题的正确选择。您应该尝试解析它并抛出错误,如果它不起作用。在python:

import json

try:
    json.loads(attempt)
except ValueError:
    print "INVALID JSON"
    raise

答案 1 :(得分:1)

需要解析JSON,以正确地找出它是否有效。您可以使用jison json parser example,并更改规则以考虑其他有效的JSON案例。但是,如果从键中删除引用要求,则解析JSON blob会变得更加困难。

我建议您保留语法相同,并添加一些error handling rules(不幸的是alpha支持)。这是一个复杂的问题,所以在潜水之前花点时间研究一下,你会好多了。

答案 2 :(得分:0)

只需将\{\s*(?!(\"|\'))(\w*[a-zA-Z]\w*)(?!(\"|\'))\s*:(.+)替换为{"$2" :$4,您将获得没有变量将没有'或':)

答案 3 :(得分:-1)

嗯,这对我有用,因为我需要匹配可以传递有效javascript变量名的字符串,并且允许在任一侧使用单引号(并且我还在两边都留有空格)。

\{+( |')?+[a-zA-Z0-9_]*+( |')?+:

我仍然围绕着正则表达式,但我的理解是,这个表达式将匹配字符串......

  1. 以{
  2. 开头
  3. 然后,可能有也可能没有空格或单引号
  4. 然后,具有与a-z,A-Z,0-9或_
  5. 匹配的任意数量的字符
  6. 然后,可能有也可能没有空格或单引号
  7. 然后,有一个:
  8. 然而,这也最终匹配了各种CSS,jQuery函数和其他非JSON字符串(至少不是我正在寻找的真正的JSON响应)...例如{display:none}之类的东西和$(...).animate({'height':'200px'})。太多的结果可用于我的目的。好啊!