簡體   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