2011-08-20 250 views
1

我有一個小型的web應用程序,我需要在字符串中執行文本替換。但是,正常的string.replace不起作用。我正在修改部分文本,然後我需要將它們放回原始字符串中。舉例來說,如果我有:JavaScript字符串多個替換

var text = 'TEXT 000.99 001.00 TEXT' 

,我需要添加0.01〜這些數字,我有個結果的數組:

var new_vals = [001.00, 001.01] 

然後,當我嘗試用001.00更換000.99 ,它會工作,並給我以下字符串:

text = 'TEXT 001.00 001.00 TEXT' 

現在我面臨的問題。接下來的更換應該是001.00 < - 001.01,但這樣做會導致:

text = 'TEXT 001.01 001.00 TEXT' 

我的問題是,你知道任何JS庫,它提供了一個替代,可以執行多個搜索/功能的同一更換時間和副本的字符串?

回答

3

使用str.replace與功能:

var text = 'TEXT 000.99 001.00 TEXT'; 
var new_vals = ["001.00", "001.01"]; 
var index = 0; 
//Returns a new result string 
var result = text.replace(/\b([\d.]+)\b/g, function(substr, num, offset, str){ 
    //See if the number is actually a number 
    var num = parseFloat(num); 
    //If not, return original 
    if(isNaN(num)) 
    return substr; 
    //Return the number from new_vals and increment the index 
    else 
    return new_vals[index++]; 
}); 
//result == "TEXT 001.00 001.01 TEXT" 

或者,你可以做在功能上增加:

var text = 'TEXT 000.99 001.00 TEXT'; 
//Returns a new result string 
var result = text.replace(/\b([\d.]+)\b/g, function(substr, num, offset, str){ 
    //See if the number is actually a number 
    var num = parseFloat(num); 
    //If not, return original 
    if(isNaN(num)) 
    return substr; 
    //Return num+0.01 with 2 decimal places 
    else 
    return (num+0.01).toFixed(2); 
}); 
//result == "TEXT 1.00 1.01 TEXT" 
+0

謝謝。在閱讀ECMA草稿時,我剛剛得出同樣的結論。它說關於string.replace:「一旦執行替換,新的替換文本不受進一步替換。」有點像我想要的,一個副本上工作的替代品。 – Jibran

0

嘗試使用全局替換正則表達式而不是簡單的字符串。簡單的字符串將只替換第一個匹配的實例。

'TEXT 001.00 001.00 TEXT'.replace(/001.00/g, '001.01'); 
+0

我做到了。那是當我發現問題的時候。 000.99與001.00的首次更換順利。問題是,當我嘗試用001.01代替001.00時,它取代了第一個001.00(我們在替換000.99後得到的那個)。我需要一個在複製時處理字符串的多個替換函數。 – Jibran

+0

你確定你在正則表達式中包含了尾部'g'。這應該強制後續的替代。 –

0

你可以嘗試split(' ')值到一個數組。然後使用循環修改特定元素。緊接着join(' ')將文本加入字符串。

+0

問題是,雖然在問題中所有文本只有一個空白b/w的單詞,但實際文本可能並非如此。保持空間的數量對於這個應用程序很重要。 – Jibran