正则表达式找到复杂的标记

时间:2012-12-12 23:30:32

标签: javascript regex

我想使用像这样的JavaScript正则表达式

/marker\d+"?(\w+)"?\s/gi

在这样的字符串中:

IDoHaveMarker1"apple" IDoAlsoHaveAMarker352pear LastPointMakingmarker3134"foo"

我希望它返回一个这样的数组:

[ "apple", "pear", "foo" ]

引号要明确它们是字符串。它们不应该出现在结果中。

1 个答案:

答案 0 :(得分:4)

如果您询问如何实际使用正则表达式:

要获得多个(全局)匹配的所有捕获,您必须在JavaScript中使用循环和exec

var regex = /marker\d+"?(\w+)/gi;
var result = [];
var match;
while (match = regex.exec(input)) {
    result.push(match[1]);
}

(请注意,如果您只对捕获感兴趣,则可以省略尾随"?\s?,因为它们是可选的,所以它们不会影响匹配的结果。)

不,g不允许你在一次通话中完成所有这些操作。如果您遗漏了g,那么exec每次都会返回相同的匹配。

正如Blender所提到的,如果你想排除诸如Marker13"something Marker14bar(不匹配的")之类的东西,你需要使用另一个捕获组和反向引用。请注意,这会将您想要的捕获推送到索引2

var regex = /marker\d+("?)(\w+)\1/gi;
var result = [];
var match;
while (match = regex.exec(input)) {
    result.push(match[2]);
}