正则表达式匹配json中的键

时间:2014-06-19 06:30:01

标签: regex json

我正在尝试匹配此类型的JSON中的键:

define({
  key1: "some text: and more",
  key2 : 'some text ',
  key3: ": more some text",
  key4: 'some text:'
});

使用此正则表达式(?<=\s|{|,)\s*(\w+)\s*:\s?[\"|\']/g。但是目前它与最后text:的匹配也应该被忽略。

可以看到一个例子here

你能否告诉我如何修复这个正则表达式,以便它只匹配键。

3 个答案:

答案 0 :(得分:3)

这个较短的正则表达式怎么样:

(?m)^[ ]*([^\r\n:]+?)\s*:

the demo中,查看右侧窗格中的第1组捕获。

  • (?m)允许^在每行的开头匹配
  • ^声称我们位于行的开头
  • [ ]*吃掉所有空格字符
  • ([^\r\n:]+?)懒惰地匹配冒号:或换行符的所有字符,并将它们捕获到第1组(这是我们想要的),最多......
  • \s*:匹配可选的空格字符和冒号

答案 1 :(得分:2)

我不建议使用正则表达式解析JSON。有一些小型库,有些甚至只有标题,并且具有非常方便的许可条款(例如rapidjson,我正在使用它)。

但是如果你真的想要,下面的表达式应该找到你的键/值对(注意我使用的是Perl,主要用于很好的语法高亮):

(\w+)\s*:\s*('[^']*'|"[^"]*"|[+\-]?\d+(?:.\d+)?)
  • 请注意,对于您的值中的转义引号或未正确包含的字符串,这将无法正常工作。
  • (\w+)将匹配完整密钥。
  • \s*匹配任何或没有空格字符序列。
  • :实际上只是直接匹配。
  • '[^']*'将匹配'所包含的任何字符(该括号的第二部分也是如此)。
  • [+\-]?\d+(?:.\d+)?将匹配任何数字(带或不带小数)。

修改:由于其他人提供了很好且易于查看的在线演示,here's mine

答案 2 :(得分:1)

试试这个正则表达式:

text最初匹配,因为它被视为密钥。

(\w+)\s*:\s*(["']).+\2,?

演示

http://regex101.com/r/zR3sT3