繁体   English   中英

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

[英]Matching on words with possibly special characters

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

ERA是投手每九局投手放弃的获胜奔跑的平均值。 同时,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。 <body onload="loadfunc()">执行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不是必需的,在这种情况下仅使用jQuery即可轻松更新jsFiddle中的DOM。

您想使用带有负前瞻的正则表达式:

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

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

零宽度字边界\\b已添加,可以很好地解决问题,因此您不会意外匹配字符串'BERA'等。

另一个想法是按最长的键到最小的键对缩写词列表进行排序。 这样,您确保在“ ERA”之前替换所有“ ERA +”,因此不会出现子字符串冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM