我想在/AA/
主题字符串中找到AA-AA-AA
模式。我需要获得匹配的字符串和匹配的位置(索引)。
我看过RegExp.prototype.exec()
。它只返回第一场比赛:
/AA/g.exec('AA-AA-AA')
答案 0 :(得分:18)
exec()
仅返回一个匹配项。要获得g
全局正则表达式的所有匹配项,您必须重复调用它,例如:
var match, indexes= [];
while (match= r.exec(value))
indexes.push([match.index, match.index+match[0].length]);
答案 1 :(得分:3)
使用RegExp.prototype.exec()
函数匹配字符串时要小心。构造的正则表达式对象是有状态的,即每次调用.exec()
时它都会影响正则表达式实例的lastIndex
property。因此,在使用正则表达式对象的实例之前,应始终重置lastIndex
属性。
let re,
findAAs;
re = /AA/;
findAAs = (input) => {
let match;
// `re` is cached instance of regex object.
// Reset `re.lastIndex` every time before using it.
re.lastIndex = 0;
while ((match = re.exec(input)) !== null) {
match.index; // Match index.
match[0]; // Matching string.
}
};
一个诱人的替代方法是在每次执行时构造正则表达式对象。根据您的任务资源密集程度,这也是一个选项。
let findAAs;
findAAs = (input) => {
let match,
re;
re = /AA/;
while ((match = re.exec(input)) !== null) {
match.index; // Match index.
match[0]; // Matching string.
}
};
使用.exec()
的实用替代方法是String.prototype.replace()
。
let findAAs,
re;
re = /AA/;
findAAs = (input) => {
let match,
re;
input.replace(re, (match, index) => {
match; // Matching string.
index; // Match index.
return '';
});
};
这种方法的缺点是它构造了主题字符串的副本。
是否应该使用它取决于您的任务的资源密集程度。就个人而言,我喜欢在代码中避免while
阻止,因此更喜欢.replace()
方法。
答案 2 :(得分:1)
http://jsfiddle.net/mplungjan/MNXvQ/
我认为这更容易掌握
var str = "AAbAAcAAd"
var re = /(AA)/gi;
var t="",cnt=0;
while ((result=re.exec(str))!=null) {
document.write((cnt++)+":"+result[1]+"<br />")
}
re.lastIndex每次都包含位置