JavaScript regexp:匹配带引号的子字符串,不带引号

时间:2015-10-31 05:19:29

标签: javascript regex

我有一个类似

的字符串
"Neo,Man,Cred,'Tred,Man,Ship',Manu"

现在我正在使用以下正则表达式

(,)(?=(?:[^']|'[^']*')*$)

用于捕获组但是将其捕获为

Neo
Man
Cred
'Tred,Man,Ship'
Manu

我想要实现的是仅使用regex从字符串中删除'(单引号)。如何实现?

1 个答案:

答案 0 :(得分:0)

您可以使用exec

循环播放
s = "Neo,Man,Cred,'Tred,Man,Ship',Manu";

r = /'(.*?)'|(\w+)/g; 
matches = [];
var match; 

while (match = r.exec(s)) {
  matches.push(match[1] || match[2]);
}

然而,正如另一个人提到的那样,使用更简单的正则表达式,没有循环逻辑,并在之后删除引号也同样有意义:

r2 = /'.*?'|\w+/g;
s.match(r2) . map(match => match.replace(/^'|'$/g, ''));

使用单个正则表达式无法执行此操作的原因是match返回完整匹配的数组,忽略捕获组。要创建不带引号的带引号子字符串的完全匹配,您需要使用lookbehind,以确保字符串前面或前面没有单引号。但是,这在JS regexp中是不可能的。如果你确实有lookbehinds,你可以把它写成

/(?<=').*(?=')|\w+/

请参阅https://regex101.com/r/aL6eA1/1