JavaScript正则表达式全局匹配组

时间:2013-11-11 18:52:28

标签: javascript regex

更新:此问题几乎与this

重复

我确信我的问题的答案就在那里,但我找不到简洁明了的话。我正在尝试使用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正则表达式有一种干净的方法吗?显然我可以自己删除',但我正在寻找用正则表达式来限制全局匹配分组的正确方法。

8 个答案:

答案 0 :(得分:72)

要使用正则表达式执行此操作,您需要使用.exec()对其进行迭代,以获得多个匹配的组。带匹配的g标志只返回多个完整匹配,而不是您想要的多个子匹配。这是使用.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/

答案 1 :(得分:5)

不是非常通用的解决方案,因为Javascript不支持lookbehind,但对于给定的输入,这个正则表达式应该有效:

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

答案 2 :(得分:1)

尝试使用input.replace(regex, "$1")之类的内容来获取捕获组的结果。

答案 3 :(得分:0)

这个正则表达式有效,但有定义的字符...

var input = "'Warehouse','Local Release','Local Release DA'";

var r =/'[\w\s]+'/gi;
console.log(input.match(regex));

答案 4 :(得分:0)

有一个名为enter image description here的ECMAScript提案可以满足您的需求。

答案 5 :(得分:0)

String.prototype.matchAll现在是well supported in modern browsers以及Node.js.,可以这样使用:

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

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

方便地,当没有找到匹配项时,这不会引发错误,因为.matchAll总是返回迭代器(vs .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" ]

答案 6 :(得分:0)

在 es2020 中,您可以使用 matchAll:

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

const match_all = [...input.matchAll(regex)];

如果您使用的是 typescript,请不要忘记在 tsconfig.json 中进行设置:

"compilerOptions": {
    "lib": ["es2020.string"]
}

答案 7 :(得分:-3)

编辑:这在javascript中不起作用,但它在java中有效。抱歉,那个。

是的,它被称为“向前看”并且“向后看”

(?<=').*?(?=')
  • (?=')展望'
  • (?&lt; =')看起来为'

测试here