我想使用正则表达式搜索来匹配包含名称不在引号中的名称/值对的无效JSON。例如:
无效(我正在尝试匹配此内容):
{name:"value"}
有效(我会修复它们看起来像这样):
{"name":"value"}
我可以使用什么RegEx来最佳匹配不包含“”双引号的对象键? (单引号可以匹配,因为我还是希望将它们转换为双引号)。
答案 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_]*+( |')?+:
我仍然围绕着正则表达式,但我的理解是,这个表达式将匹配字符串......
然而,这也最终匹配了各种CSS,jQuery函数和其他非JSON字符串(至少不是我正在寻找的真正的JSON响应)...例如{display:none}
之类的东西和$(...).animate({'height':'200px'})
。太多的结果可用于我的目的。好啊!