此答案中使用的术语:
- Match表示对字符串运行RegEx模式的结果,如下所示:
someString.match(regexPattern)
。
- 匹配的模式指示输入字符串的所有匹配部分,它们全部位于match数组内。这些都是输入字符串中模式的所有实例。
- 配对组指示在RegEx模式中定义的所有要捕获的组。(括号内的模式,例如:
/format_(.*?)/g
,(.*?)
将是一个匹配的组。)它们位于匹配的模式内。
描述
要访问匹配的组,在每个匹配的模式中,您都需要一个函数或类似的东西来迭代匹配。正如许多其他答案所示,您可以通过多种方式来执行此操作。大多数其他答案都使用while循环迭代所有匹配的模式,但是我认为我们都知道该方法的潜在危险。有必要与a匹配,new RegExp()
而不仅仅是模式本身,后者仅在注释中提及。这是因为该.exec()
方法的行为类似于生成器函数 - 每次有匹配项时它都会停止,但是.lastIndex
在下一次.exec()
调用时会继续从那里继续。
代码示例
以下是一个函数示例,该函数searchString
返回Array
所有匹配模式的,其中每个match
是,其中Array
包含所有匹配的组。我没有使用while循环,而是提供了使用Array.prototype.map()
函数以及更for
高效的方法的示例-使用纯循环。
简洁的版本(更少的代码,更多的语法糖)
这些性能较低,因为它们基本上实现forEach
-loop而不是更快for
-loop。
// Concise ES6/ES2015 syntax
const searchString =
(string, pattern) =>
string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
// Or if you will, with ES5 syntax
function searchString(string, pattern) {
return string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
性能版本(更多代码,更少语法糖)
// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
let result = [];
const matches = string.match(new RegExp(pattern.source, pattern.flags));
for (let i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
};
// Same thing, but with ES5 syntax
function searchString(string, pattern) {
var result = [];
var matches = string.match(new RegExp(pattern.source, pattern.flags));
for (var i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
我还没有将这些替代方案与其他答案中先前提到的替代方案进行比较,但是我怀疑这种方法与其他方法相比,其性能和故障安全性更低。