借助RegExp递归捕获标识符

时间:2019-01-12 14:50:38

标签: javascript regex

我正在尝试匹配以下字符串:

 something, something, something, something, something shouldignore

所需的输出为:[something, something, something, something, something]。我想出了这个RegExp (^[\t ]+[^,\s]+),但不适用于其他4个something

Demo

2 个答案:

答案 0 :(得分:3)

您可以使用back-references,尽管我不确定您为什么需要这样做(RE并不总是最好的解决方案!):

^[\t ]+([^,\s]+)(, \1)*

此处\1与捕获的#1组匹配。

Online on RegExr

答案 1 :(得分:0)

您的正则表达式仅匹配第一部分,因为您使用锚点^来声明字符串的开头,并且不会重复已匹配的内容。

您可以使用正则表达式并在末尾添加(?:,\1)*,以便使用后向引用重复已捕获的内容。您也可以将锚点^从组中移出并放在开始位置。

^([\t ]+[^,\s]+)(?:,\1)*

Regex demo

您可以用逗号分割并修剪结果数组中的项目:

const str = " something, something, something, something, something shouldignore";

let res = str.match(/^([\t ]+[^,\s]+)(?:,\1)*/)[0]
    .split(',')
    .map(x => x.trim());

console.log(res);

如果在something之后可能还会出现另一个shouldignore,则可以用一个逗号分隔,后跟1+个空格字符,?\s+,并过滤出与逗号不同的字符。从split返回的数组中的第一项:

const str = " something, something, something, something, something shouldignore something";

let res = str.trim()
    .split(/,?\s+/)
    .filter((x, _, a) => x === a[0]);
console.log(res);