匹配可能有特殊字符的单词

我试图替换字符串中给定单词的所有出现,但可能该单词包含需要转义的特殊字符。 这是一个例子:

ERA是投手每投9局投出的平均投球数。 同时,根据投手的球场(如果球场赞成击球手或投手)和投手联盟的ERA,ERA +是调整后的ERA,是投手的得分平均(ERA)。

我希望能够做到以下几点:

string = "The ERA..." // from above
string = string.replaceAll("ERA", "<b>ERA</b>");
string = string.replaceAll("ERA+", "<u>ERA+</u>");

没有ERA和ERA冲突。 我一直在使用先前发布的原型replaceAll以及在SO上发现的其他正则表达式(我似乎无法在我的历史中找到链接)

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-/^$*+?.()|[]{}]/g, '$&'), 'g'),     replace);
};

function loadfunc() {
    var markup = document.getElementById('thetext').innerHTML;
    var terms = Object.keys(acronyms);
    for (i=0; i<terms.length; i++) {
        markup = markup.replaceAll(terms[i], '<abbr title="' + acronyms[terms[i]] + '">' + terms[i] + '</abbr>');
    }
    document.getElementById('thetext').innerHTML = markup;
}

基本上,代码所做的就是在缩略词上添加一个标签,以便在鼠标悬停时添加定义。 问题是目前的正则表达式太松散了。 我以前的尝试部分工作,但未能在ERA和ERA +之间做出区别,或者完全跳过“K / 9”或“IP / GS”之类的事情(应该是自己匹配而不是“IP”或“GS”)

我应该提到缩写词是一个看起来像这样的数组:

var acronyms = {
    "ERA": "Earned Run Average: ...",
    "ERA+": "Earned Run Average adjusted to ..."
};

另外(虽然这很明显) 'thetext'是一个包含一些文本的虚拟div。 loadfunc()函数从<body onload="loadfunc()">

谢谢!


好的,在看完你的jsFiddle之后,这是很多的工作。

我认为你将得到的最好结果是搜索以大写字母开头并可能包含/%整个单词。 像这样: ([AZ][w/%]+)

警告:不管你如何做到这一点,如果你在浏览器中做这件事(例如你不能更新原始数据),这将是过程密集型的。

你可以像这样实现它:

var repl = str.replace(/([A-Z][w/%]+)/g, function(match) {
    //alert(match);
    if (match in acronyms)
        return "<abbr title='" + acronyms[match] + "'>" + match + "</abbr>";
    else
        return match;
});

这是一个工作jsFiddle:http://jsfiddle.net/remus/9z6fg/

请注意,jQuery不是必需的,只是在这种情况下使用它,以方便更新jsFiddle中的DOM。


你想要使用带有负面看法的正则表达式:

string.replace(/bERA(?!+)b/g, "<b>ERA</b>");

string.replace(/bERA+/g, "<u>ERA+</u>");

零宽度的单词边界b已经被添加以便于测量,因此您不会意外地匹配“BERA”等字符串等。

另一个想法是按最长键将缩略词列表排序为最小。 这样你就可以在'ERA'之前替换所有'ERA +',所以不存在子串冲突。

链接地址: http://www.djcxy.com/p/94039.html

上一篇: Matching on words with possibly special characters

下一篇: replace multiple <br> tags with javascript