54

更新:这个问题几乎是这个问题的重复

我确定我的问题的答案就在那里,但我找不到简洁的词语来表达它。我正在尝试使用 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 正则表达式来做到这一点?显然我可以'自己去掉 s ,但我正在寻找正确的方法来使用正则表达式捕获全局匹配的分组。

4

8 回答 8

104

要使用正则表达式执行此操作,您需要对其进行迭代.exec()以获得多个匹配的组。带有 match的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/


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

于 2013-11-11T18:55:03.513 回答
6

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

于 2019-12-19T09:01:42.310 回答
5

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

m = input.match(/([^',]+)(?=')/g);
//=> ["Warehouse", "Local Release", "Local Release DA"]
于 2013-11-11T19:02:22.967 回答
4

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" ]
于 2020-11-24T19:35:51.017 回答
1

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

于 2013-11-11T18:57:07.057 回答
1

使用 es2020,您可以使用matchAll

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

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

如果您使用的是打字稿,请不要忘记将其设置为tsconfig.json

"compilerOptions": {
    "lib": ["es2020.string"]
}
于 2021-03-24T02:37:12.463 回答
-1

此正则表达式有效,但具有定义的字符...

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

var r =/'[\w\s]+'/gi;
console.log(input.match(regex));
于 2013-11-11T18:59:44.333 回答
-2

编辑:这在 javascript 中不起作用,但在 java 中起作用。对不起。

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

(?<=').*?(?=')
  • (?=') 向前看 '
  • (?<=') 在后面寻找 '

在这里测试一下

于 2013-11-11T18:59:37.773 回答