JavaScript 正则表达式全局匹配组

IT技术 javascript regex pattern-matching
2021-02-19 18:46:14

更新:这个问题是一个近似重复

我确信我的问题的答案就在那里,但我找不到简洁的语言来表达它。我正在尝试使用 JavaScript 正则表达式执行以下操作:

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

console.log(input.match(regex));

// Actual:
// ["'Warehouse'", "'Local Release'", "'Local Release DA'"]

// What I'm looking for (without the '):
// ["Warehouse", "Local Release", "Local Release DA"]

有没有一种干净的方法可以用 JavaScript regex 做到这一点?显然我可以'自己去掉 s,但我正在寻找使用正则表达式捕获全局匹配分组的正确方法。

6个回答

要使用正则表达式执行此操作,您需要对其进行迭代.exec()以获得多个匹配的组。g带有 match标志只会返回多个完整匹配项,而不是您想要的多个子匹配项。这是一种使用.exec().

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

var matches, output = [];
while (matches = regex.exec(input)) {
    output.push(matches[1]);
}
// result is in output here

工作演示:http : //jsfiddle.net/jfriend00/VSczR/


对字符串中的内容有一定的假设,你也可以使用这个:

var input = "'Warehouse','Local Release','Local Release DA'";
var output = input.replace(/^'|'$/, "").split("','");

工作演示:http : //jsfiddle.net/jfriend00/MFNm3/


注意:使用截至 2021 年的现代 Javascript 引擎,您可以str.matchAll(regex)在一个函数调用中使用和获取所有匹配项。

添加了一种非正则表达式的方式来做到这一点。
2021-04-15 18:46:14
@keithics - jslink 返回的到底是什么null这很奇怪。 .exec()应该返回一个数组,null所以原始代码应该检测到没有匹配就好了。
2021-04-16 18:46:14
这将在 jslink 中失败 .. 这样做,而 ((matches = regex.exec(input)) !== null){
2021-04-19 18:46:14
我用这个正则表达式应用了这个循环,/<img[^>]+?src=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i控制台不响应,chrome 使用 1 个完整的 cpu 核心
2021-04-20 18:46:14
哦,我忘记g修改器了。现在好啦
2021-04-20 18:46:14

有一个 ECMAScript 提案String.prototype.matchAll()可以满足您的需求。

2021-04-23 18:46:14
看起来这已经得到了很好的支持!甜的!
2021-05-11 18:46:14

不是很通用的解决方案,因为 Javascript 不支持lookbehind,但对于给定的输入,这个正则表达式应该可以工作:

m = input.match(/([^',]+)(?=')/g);
//=> ["Warehouse", "Local Release", "Local Release DA"]

String.prototype.matchAll现在在现代浏览器Node.js 中得到很好的支持这可以像这样使用:

const matches = Array.from(myString.matchAll(/myRegEx/g)).map(match => match[1]);

请注意,传递的RegExp必须具有全局标志,否则将引发错误。

方便的是,当找不到匹配项时,这不会引发错误,因为.matchAll总是返回迭代器(与.match()返回null)。


对于这个特定的例子:

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

var matches = Array.from(input.matchAll(regex)).map(match => match[1]);
// [ "Warehouse", "Local Release", "Local Release DA" ]
Array.from接受 amapFn作为第二个参数。所以还有可能是:Array.from(myString.matchAll(/myRegEx/g), m => m[1]). MDN 在其matchAll文档中使用它作为示例,请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-26 18:46:14

尝试类似的方法input.replace(regex, "$1")来获取捕获组的结果。

OP 想要一个数组中的结果。
2021-04-16 18:46:14
我喜欢你的思路,假设内容中没有,s。
2021-04-18 18:46:14
进入阵列 - input.replace(regex, "$1").split(',')
2021-05-09 18:46:14
@Jondlm 可以做 -regex = /'(.*?)'(,?)/g;并且input.replace(regex, "$1$2$2").split(',,')
2021-05-10 18:46:14