Skip to content

js 正则匹配返回所有匹配到的范围

js正则默认不返回匹配到的范围,有些场景用起来就不太方便。如果想针对于匹配到的位置多次操作就要另外想个办法了。 indexOf 这个只能获取到第一个出现的位置,其他位置不太行,这个方法好像就行不通了。 自己一个个找,写个kmp算法感觉有比较麻烦。 翻了翻正则的文档发现还有个 exec 可以用。可以反复执行,内部应该是个类似闭包的实现吧,例子如下:

javascript
var regex = /ab/g
var text = "abcabdabe"
regex.exec(text)
// ['ab', index: 0, input: 'abcabdabe', groups: undefined]
regex.exec(text)
// ['ab', index: 3, input: 'abcabdabe', groups: undefined]
regex.exec(text)
// ['ab', index: 6, input: 'abcabdabe', groups: undefined]
regex.exec(text)
// null
regex.exec(text)
// ['ab', index: 0, input: 'abcabdabe', groups: undefined]

还能记录上次匹配的位置。那么就可以这么来了。 稍微封装一下:

javascript
function rangeMatch(regex, text) {
    let groups = []
    var match;
    while (match = regex.exec(text)) {
        console.log("找到匹配的文本:", match[0]);
        console.log("匹配的起始位置:", match.index);
        console.log("匹配的结束位置:", match.index + match[0].length);
        console.log('text ', text)
        let start = match.index
        let end = match.index + match[0].length
        groups.push([start, end])
    }

    return groups
}
rangeMatch(regex, text)
// [Array(2), Array(2), Array(2)]