2014-01-08 51 views
2

我需要匹配並替換字符串中未包含在標記:$$:內的所有出現的「單詞」。 'word'旁邊的標籤中可能還有其他字符。javascript:正則表達式匹配未包含在自定義標記中的單詞

所以,說我有串

abc word hey :$ my word $:

而且我需要letter更換word;基本上我想獲得以下字符串:

abc letter hey :$ my word $:

什麼是實現在Javascript中的最佳方式是什麼?

更多信息:

標籤不會嵌套。 該字符串可能包含單個字符':'和'$'。在這種情況下,他們應該被視爲簡單的字符而不是標籤。

+0

什麼方式,你都試過?什麼地方出了錯?你能發佈一個現場演示來重現這個問題嗎? – elclanrs

+1

僅供參考,'Javascript'和'Java'不相關,所以不要用'Java'標記'Javascript'問題。 – Thor84no

+2

這對於正則表達式來說會非常困難。最好你寫一個小解析器。 – Reeno

回答

2

我不能指定一個正則表達式,所以這裏是,這是否更迫切的方法 - http://jsfiddle.net/dNhLm/

var text = "abc word hey :$ my word $:"; 
var replace = function(text, pattern, replacement) { 
    var parts = []; 
    // This will split the string into parts. The ones that has :$ we will have to proceed further and ignore 
    var splitByEnd = text.split('$:');  
    for (i = 0, l = splitByEnd.length; i < l; i++) { 
     // Here we should have at most 2 parts. The left one will be outside of the :$,$: pairs and is the 
     // one we will apply the replacement. The right one if present will be between the :$,$: pairs and is 
     // not a subject of replacement. 
     var splitByStart = splitByEnd[i].split(':$'); 
     splitByStart[0] = splitByStart[0].replace(pattern, replacement); 

     parts.push(splitByStart.join(':$')); 
    } 

    return parts.join('$:'); 
} 

alert(replace(text, 'word', 'letter')); 
+0

感謝您的嘗試。我應該提到可能有多個標籤對出現,有些甚至可能不包含「單詞」。看起來你的代碼只有在有一個標籤對的情況下才有效。 – user3173481

+0

@ user3173481其實我已經寫了一個期望,你會有多個:$,$:對。我剛剛檢查了一個更復雜的字符串,它工作 - http://jsfiddle.net/dNhLm/1/ 有一個假設,你沒有嵌套標籤。 – edzhelyov

+0

對不起,你是對的,也可以使用多個:$,$:對。謝謝! – user3173481

0
^(.+?)?(:\$.+?\$:)(.+?)?$ 

Regular expression visualization

這會給你三個捕獲組:

  1. 之前的所有內容:??:
  2. 插圖中的自定義標籤內容
  3. 一切:??:

然後你要做的第一和第三捕獲組的通常stringreplace,與letter更換word後。

第一組和第三組是可選的,至:?word?: another word也會匹配。

var regex = /^(.+?)?(:\$.+?\$:)(.+?)?$/i; 
regex.exec('abc word hey :$ my word $:'); 
alert(RegExp.$1.replace("word", "letter") + RegExp.$2 + RegExp.$3.replace("word", "letter")); 

Fiddle
[email protected]

+0

有趣的方法,但它不處理多個標籤。 – Thor84no

0

有沒有簡單的正則表達式,我能想到的。

你可以找多個正則表達式,而不是

var s1 = 'abc word hey :$ my word $: def word :$ another word $: word ghi :$ a third word $: jkl word'; 
var s2; 

// word at the beginning 
s2 = s1.replace(/^([^:$]*)word/, '$1letter'); 
// word at the end 
s2 = s1.replace(/word([^:$]*)$/, 'letter$1'); 
// and word in between 
s2 = s1.replace(/(:[^$]*)word([^$]*:)/g, '$1letter$2'); 
console.log(s2); 

JSFiddle

+0

不應該在正則表達式中轉義'$'? – Thor84no

+0

@ Thor84no'$'在字符集內,所以不需要。你可以看到,它在JSFiddle中起作用。 –

+0

@ Thor84no另請參閱http://jsfiddle.net/V7RKR/進行比較。 –

1

我不知道正則表達式是這裏的工作的工具(解析器可能更合適),但我猜測一個簡單的解決辦法是剪掉標籤覆蓋的位,替換所有字,然後替換標籤。

var line = 'abc word hey :$ my word $: word :$ my word $:'; 
var tags = []; 
var index = 0; 
while (line.match(/:\$.*\$:/)) { 
    var start = line.indexOf(':$'); 
    var end = line.indexOf('$:', start); 
    var tag = line.substring(start, end + 2); 
    line = line.replace(tag, '$tag' + index + '$'); 
    tags.push(tag); 
    index++; 
} 
line = line.replace(/word/g, 'letter'); 
for (var i = 0; i < tags.length; i++) { 
    line = line.replace('$tag' + i + '$', tags[i]); 
} 
document.write('result ' + line) 

此輸出:沿着該線(這將不支持嵌套的標籤,但原本應該工作)的東西

result abc letter hey :$ my word $: letter :$ my word $: 
+0

真的很有幫助,謝謝。 –

相關問題