匹配可能有特殊字符的单词
我试图替换字符串中给定单词的所有出现,但可能该单词包含需要转义的特殊字符。 这是一个例子:
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