我目前有一个正则表达式,可以通过所有空格来分隔字符串,除非它在引号段内:
keywords = 'pop rock "hard rock"';
keywords = keywords.match(/\w+|"[^"]+"/g);
console.log(keywords); // [pop, rock, "hard rock"]
然而,我也希望关键字中可以包含引号,就像这样:
keywords = 'pop rock "hard rock" "\"dream\" pop"';
这应该返回什么。[pop, rock, "hard rock", "\"dream\" pop"]
最简单的方法是什么?
\\.
而不是\\"
,因为反斜杠也可以被转义,您不会想错过"foo\\\\"
。 - Tim Pietzcker"\\" "foo"
(为了更清楚只有两个反斜杠),第一个"
将与正则表达式开头的字面上的"
匹配。然后,[^"]
将匹配第一个 \。剩下的\"
将被\\"
匹配(因为它先出现在选择中)。然后,[^"]
将匹配空格和正则表达式末尾的"
将匹配"foo"
的开头引号,从而破坏解析。 - Tim Pietzcker(?<!\\)(?:\\\\)*
。也就是说,不以反斜杠开头,然后必须有偶数个反斜杠(即转义的反斜杠)。换句话说,开头的引号必须由0、2、4、6等数量的反斜杠作为前缀,否则(即1、3等数量的反斜杠)我们将不认为它是开头的引号。 - Timokeywords = keywords.match(/\w+|"(?:\\"|[^"])+"/g).map((a) -> if a.match(/".+"/g) then a.slice(1, -1) else a)
。这不是纯正则表达式,但仍然不需要JavaScript尚未具备的功能:正则表达式后顾。 - Gustavo6046