在字符串中查找所有匹配的正则表达式模式和匹配的索引

时间:2011-05-30 15:50:52

标签: javascript regex

我想在/AA/主题字符串中找到AA-AA-AA模式。我需要获得匹配的字符串和匹配的位置(索引)。

我看过RegExp.prototype.exec()。它只返回第一场比赛:

/AA/g.exec('AA-AA-AA')

3 个答案:

答案 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每次都包含位置