[英]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.