2011-08-20 129 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