简单分隔符之间的匹配,但分隔符本身不匹配

时间:2019-08-31 20:09:17

标签: javascript regex

我正在查看仅在文本文件中的JSON数据。除了使用正则表达式获取引号之间的值外,我不想做任何事情。我只是将其用作帮助练习正则表达式的一种方法,到这一点似乎应该很简单,但事实并非如此(至少对我和办公室中的其他一些人而言)。我在regex中轻松匹配了复杂的url,所以我对regex并不陌生。对我来说,这似乎是一个奇怪的情况。

我尝试过:

/(?:")(.*?)(?:")/

/"(.*?)"/

和其他几个,但是这些离我最近了。

基本上,我们可以忘记它是JSON,而只是说我想将“值”和“值”和“东西”中的东西进行匹配。我尝试的所有内容都包括引号,因此我必须在定界符之后清除字符串,否则字符串实际上就是带引号的“值”。

无论是简单还是复杂的任何帮助,我都希望知道!谢谢

更新:好的,所以我认为我将与(?<=")(.*?)(?=")一起使用,并且在没有全局设置的情况下逐行读取内容,因此我只获得每行的第一个匹配项。在我的代码中,我只是将一个巨大的字符串放入代码中的var中,而不是实际使用ajax / filereader打开文件或设置表单来输入数据。我想我会将其标记为已解决,非常感谢!

2 个答案:

答案 0 :(得分:1)

您有两种选择来解决此问题:

使用捕获组

您可以匹配定界符并使用捕获组在其中获取文本。在这种情况下,您的两个正则表达式将起作用,但是您需要使用访问捕获组1来获取结果(demo)。有关具体操作,请参见How do you access the matched groups in a JavaScript regular expression?

使用零宽度断言

您可以使用零宽度断言来仅匹配其中的文本,在它们之间需要定界符而不实际匹配它们(demo):

(?<=")(.*?)(?=")

但是现在由于我不使用引号,因此可以在每个引号之间找到实例,而不仅是在成对的引号之间:例如,a"b"c"会找到bc

至于只获得第一个比赛,我认为默认情况下会在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)));