2016-04-21 116 views
1

我想用正則表達式替換特定的字符串。在字符串中使用正則表達式替換javascript

var replace = {'<RAndom>': "random object"}; 

我使用動態正則表達式替換它,因爲我有很多對象。

var tagsText = "<RAndom> hellow world"; 
var regex = new RegExp('\\b(' + Object.keys(replace).join('|') + ')\\b', 'g'); 
tagsText = tagsText.replace(regex, function(match) { 
    return replace[match] + match; 
}); 

但它不工作。我認爲問題是用分號,但我不知道。輸出也是一樣的。

"<RAndom> hellow world" 

任何想法?

+1

您應該刪除'\\ b's或分別替換爲(^ | \\ W)'和'(\\ W | $)'。 –

回答

1

字邊界\b和非單詞邊界斷言行爲取決於上下文。讓它上下文獨立的,明確的(^|\W)($|\W)

var replace = {'<RAndom>': "random object"}; 
 
var tagsText = "<RAndom> hellow world"; 
 
var regex = new RegExp('(^|\\W)(' + Object.keys(replace).join('|') + ')(\\W|$)', 'g'); 
 
tagsText = tagsText.replace(regex, function(match, g1, g2, g3) { 
 
    return replace[g2] ? replace[g2] + match : match; 
 
}); 
 
// And just a demo below 
 
document.body.innerHTML = "<pre>" + tagsText.replace(/&/g, '&amp;') + "</pre>";

(^|\W)將匹配字符串或一個非文字字符的開始。 ($|\W)將匹配字符串的末尾或非單詞字符。

由於我們現在有3組,所以我們可以將它們作爲參數傳遞給替換回調函數。用replace[g2] ? replace[g2] + match : match;,我們首先檢查是否有g2鍵的值,如果是,則執行替換。否則,只需返回match

+1

感謝真棒解釋:) – soldiershin

2

問題是在&;之前放置的每一邊存在\b(字邊界)。 &;不是非單詞字符,並且\b不能在非單詞字符之前和之後被斷言。

您可以使用\B代替:

var regex = new RegExp('\\B(' + Object.keys(replace).join('|') + ')\\B', 'g'); 

然後

tagsText = tagsText.replace(regex, function(match) { 
    return replace[match] + match; 
}); 

//=> "random object&lt;RAndom&gt; hellow world" 
+0

如果某個鍵以單詞字符開頭或結尾,則會失敗。 –

+0

在這種情況下,OP的代碼可以工作。我想從OP得到更多關於'\ b'背後的意圖和更多例子的細節。 – anubhava

+0

或者使用獨立於上下文的解決方案。有點:) –

相關問題