我正在尝试匹配此类型的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
你能否告诉我如何修复这个正则表达式,以便它只匹配键。
答案 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)