1

考虑以下代码:

function Matcher(source, search) {

    var opts = search.split('');

    for (var i = 0; i < opts.length; i++) {
        opts[i] = '(' + opts[i] + ')';  
    }

    opts = opts.join('.*');

    var regexp = new RegExp(opts, 'gi');

    source = source.replace(regexp, function () {
        console.log(arguments);
        return arguments[1];
    });

    return source;
}

您调用将源作为第一个参数传递的函数,并将您需要匹配的作为第二个参数。

我需要的是用巧合周围的粗体标签替换所有捕获组。

例如,考虑以下情况:

var patt = /m([a-z0-9\-_]*?)r([a-z0-9\-_]*?)i([a-z0-9\-_]*?)e([a-z0-9\-_]*\.[a-z]+)/gi;
var newFileName = fileName.replace(patt, "<strong>m</strong>$1<strong>r</strong>$2<strong>i</strong>$3<strong>e</strong>$4");

这段代码是特里对我上一个问题的回答,但这里的问题是你需要确切地知道你想要替换什么,我需要它动态。

有什么想法吗?

4

3 回答 3

2

似乎您正在以错误的方式创建模式。您无需构建a(.*?)b(.*?)c,而是创建(a).*(b).*(c)- 使用您已经知道的部分周围的捕获组。更好的:

function wrapEachLetter(source, search, tag) {
    var opts = search.split('');
    tag = tag || "strong";

    return source.replace(new RegExp(opts.join("(.*?)"), 'gi'), function () {
        var str = '<'+tag+'>'+opts[0]+'</'+tag+'>';
        for (var i=1; i<opts.length; i++)
            str += arguments[i] + '<'+tag+'>'+opts[i]+'</'+tag+'>';
        return str;
    });
}

例子:

> wrapEachLetter("testExampleString", "tex", "b")
"<b>t<b><b>e<b>stE<b>x<b>ampleString"
于 2013-09-11T22:07:17.677 回答
1

也捕获定界符,然后只处理偶数子组,奇数子组保持原样:

s = "ABC---DEF---HIJ"
re = /(\w+)(.*?)(\w+)(.*?)(\w+)/
s.replace(re, function() { 
     return [].slice.call(arguments, 1, -2).map(function(a, n) { 
        return n & 1 ? a : "<strong>" + a + "</strong>" 
     }).join("") 
})

> "<strong>ABC</strong>---<strong>DEF</strong>---<strong>HIJ</strong>"

但是,如果您的目标是仅突出显示单个字符,则这种方式要简单得多:

str = "myfile.js"
letters = "mis"
re = new RegExp("[" + letters + "]", "gi")
str.replace(re, "<b>$&</b>")

> "<b>m</b>yf<b>i</b>le.j<b>s</b>"

或者,没有正则表达式:

str = "myfile.js"
letters = "mis"
str.split("").map(function(s) { 
     return letters.indexOf(s) >= 0 ? "<b>" + s + "</b>" : s 
}).join("")

> "<b>m</b>yf<b>i</b>le.j<b>s</b>"
于 2013-09-11T22:10:42.577 回答
1
var input = "aBcDeFgHiJk",
    match = 'be';
    str = '',
    reg = '',
    i = 0;

function escapeRegExp(c) {
    return c.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

// /(.*)(b)(.*)(e)(.*)/gi
// '$1<b>$2</b>$3<b>$4</b>$5'
for (var c in match) {
    if (i == 0) {
        str += '$' + ++i;
        reg += '(.*)';
        i++;
    }
    str += '<b>$' + i++ + '</b>$' + i++;
    reg += '(' + escapeRegExp(match[c]) + ')(.*)';
}


alert(input.replace(new RegExp(reg, 'ig'), str)); // <- a<b>B</b>cD<b>e</b>FgHiJk
于 2013-09-12T18:00:50.393 回答