在正则表达式的帮助下递归捕获标识符



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

 something, something, something, something, something shouldignore

所需的输出为:[something, something, something, something, something] 。我想出了这个正则表达式(^[t ]+[^,s]+),但它不适用于其他 4 something

演示。

你可以为此使用反向引用,尽管我不确定你为什么需要这个(RE 并不总是最好的解决方案!

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

在这里1匹配捕获的任何组 #1。

在正则表达式上在线。

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

您可以使用正则表达式并将(?:,1)*添加到末尾,以便使用反向引用重复已经捕获的内容。您还可以将定位点^移出组并将其放在开头。

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

正则表达式演示

您可以在逗号上拆分并修剪结果数组中的项目:

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

如果在 shouldignore 之后可能会出现另一个something,您可以在可选的逗号后跟 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);

最新更新