2015-07-21 43 views
1

我正在學習正則表達式,並且我有疑問。我們來考慮一下替換第二組[和]之間的字符串

var s = "YYYN[1-20]N[]NYY"; 

現在,我想在第二次出現時在[和]之間替換/插入'1-8'。 然後輸出應該

YYYN[1-20]N[1-8]NYY 

對於使用replace和傳遞的功能,通過它,如下圖所示我曾嘗試:

var nth = 0; 
s = s.replace(/\[([^)]+)\]/g, function(match, i, original) { 
    nth++; 
    return (nth === 1) ? "1-8" : match; 
}); 
alert(s); // But It wont work 

我認爲,正則表達式是不是matchIing,我使用的字符串。 我該如何解決它?

回答

3

您正則表達式\[([^)]+)\]將不匹配空方括號,因爲+需要至少1個字符,而不是)。我想你想寫\[[^\]]*\]

這裏是您的解決方案修復:

var s = "YYYN[1-20]N[]NYY"; 
 
var nth = 0; 
 
s = s.replace(/\[[^\]]*\]/g, function (match, i, original) { 
 
    nth++; 
 
    return (nth !== 1) ? "[1-8]" : match; 
 
}); 
 
alert(s);

這裏是做的另一種方式:

var s = "YYYN[1-20]N[]NYY"; 
 
var nth = 0; 
 
s = s.replace(/(.*)\[\]/, "$1[1-8]"); 
 
alert(s);

的REG ex (.*)\[\]儘可能多地匹配並捕獲第1組文本(因此我們得到最後一組空的[]),然後匹配空的方括號。然後我們恢復[]之前的文本與$1反向引用並添加字符串1-8

0

您可以使用下面的正則表達式:

var s = "YYYN[1-20]N[]NYY"; 
 
var nth = 0; 
 
s = s.replace(/([^[]+\[(?:[^[]+)\][^[]+)\[[^[]+\](.+)/, "$1[1-8]$2"); 
 
alert(s);

第一部分([^[]+\[([^[]+)\][^[]+)將匹配字符串包含[]之間的第一子串。和\[[^[]+\]將是你想要的第二個,最後一個部分(.+?)匹配你的字符串的其餘部分。

0

如果它是僅有的兩個OCCURENCES方括號的,那麼這將工作:

/(.*\[.*?\].*\[).*?(\].*)/ 

此正則表達式具有「YYYN [1-20] N [」作爲第一個捕獲組和「] NYY」作爲第二。

0

我建議使用簡單splitjoin操作:

var s = "YYYN[1-20]N[]NYY"; 
var arr = s.split(/\[/) 
arr[2] = '1-8' + arr[2] 

var r = arr.join('[') 
//=> YYYN[1-20]N[1-8]NYY 
相關問題