我正在查看仅在文本文件中的JSON数据。除了使用正则表达式获取引号之间的值外,我不想做任何事情。我只是将其用作帮助练习正则表达式的一种方法,到这一点似乎应该很简单,但事实并非如此(至少对我和办公室中的其他一些人而言)。我在regex中轻松匹配了复杂的url,所以我对regex并不陌生。对我来说,这似乎是一个奇怪的情况。
我尝试过:
/(?:")(.*?)(?:")/
/"(.*?)"/
和其他几个,但是这些离我最近了。
基本上,我们可以忘记它是JSON,而只是说我想将“值”和“值”和“东西”中的东西进行匹配。我尝试的所有内容都包括引号,因此我必须在定界符之后清除字符串,否则字符串实际上就是带引号的“值”。
无论是简单还是复杂的任何帮助,我都希望知道!谢谢
更新:好的,所以我认为我将与(?<=")(.*?)(?=")
一起使用,并且在没有全局设置的情况下逐行读取内容,因此我只获得每行的第一个匹配项。在我的代码中,我只是将一个巨大的字符串放入代码中的var中,而不是实际使用ajax / filereader打开文件或设置表单来输入数据。我想我会将其标记为已解决,非常感谢!
答案 0 :(得分:1)
您有两种选择来解决此问题:
使用捕获组
您可以匹配定界符并使用捕获组在其中获取文本。在这种情况下,您的两个正则表达式将起作用,但是您需要使用访问捕获组1来获取结果(demo)。有关具体操作,请参见How do you access the matched groups in a JavaScript regular expression?。
使用零宽度断言
您可以使用零宽度断言来仅匹配其中的文本,在它们之间需要定界符而不实际匹配它们(demo):
(?<=")(.*?)(?=")
但是现在由于我不使用引号,因此可以在每个引号之间找到实例,而不仅是在成对的引号之间:例如,a"b"c"
会找到b
和c
。
至于只获得第一个比赛,我认为默认情况下会在JavaScript中发生。您必须先要求重复匹配,然后才能看到后续的匹配项。因此,如果您一次处理一行文件,那么您应该会得到所需的内容。
答案 1 :(得分:0)
获取引号之间的值
要记住的一件事是有效的JSON接受带引号的值内的转义引号。因此,在捕获“unrolling-the-loop” pattern完成的组时,RegEx应该考虑到这一点。
var pattern = /"[^"\\]*(?:\\.[^"\\]*)*"/g;
var data = {
"value": "This is \"stuff\".",
"empty": "",
"null": null,
"number": 50
};
var dataString = JSON.stringify(data);
console.log(dataString);
var matched = dataString.match(pattern);
matched.map(item => console.log(JSON.parse(item)));