javascript正则表达式字符串替换只工作一次

时间:2011-04-06 21:19:36

标签: javascript regex

问候。

我有一个功能,可以查看“价格”字段的内容并更新“购物车”字段中的字符串。在“cart”字段中,字符串在|之间字符被“价格”中输入的内容替换。我当前的功能只能工作一次,而连续的更改没有任何反应。我知道这不是事件本身的问题,因为如果我在没有正则表达式的情况下替换整个字段,它可以正常工作。

这是“购物车”字段的格式,15需要替换为“价格”字段中的内容: {nicepaypal:cart | 15 | 2010年新增}

$('price').addEvent('keyup', function() {
    var price = $(this).value;
    var currentCartValue = $('cart').value;
    var oldPrice = String(currentCartValue.match(/\|...\|/));
    oldPrice = oldPrice.substring(1, oldPrice.length-1);  // ugly but could not get lookaheads for "between" characters to work properly
    var newCartValue = currentCartValue.replace(oldPrice, price);
    $('cart').value = newCartValue;
});

另一种变体也不起作用:

newCartValue = currentCartValue.replace(/\|...\|/), '|'+price+'|');

为什么在“价格”字段中多次按键不起作用。谢谢。

3 个答案:

答案 0 :(得分:5)

您需要将g(全局)标志添加到正则表达式。

newCartValue = currentCartValue.replace(/\|...\|/g, '|'+price+'|');

答案 1 :(得分:2)

String.replace默认只替换第一个实例。使用正则表达式时,可以通过使用全局(g)标志来更改此设置。请参阅第一个示例中使用下面的g标记。

// replace globally
var str1 = "A man is a man is a man."
str1 = str1.replace(/man/g, "woman");
alert(str1);

// replaced only once
var str2 = "A dog is a dog is a dog."
str2 = str2.replace("dog", "cat");
alert(str2);

答案 2 :(得分:2)

您必须确保 | 之间始终只有 3 个字符。

假设价格应该总是一个数字(可能是一个浮点数),你不能把它改成

newCartValue = currentCartValue.replace(/\|\d+\.*\d*\|/g, '|'+price+'|');

如果您不想查看号码,请尝试此

newCartValue = currentCartValue.replace(/\|.*?\|/g, '|'+price+'|');

?之后的.*非常重要,因为它确保它匹配 | 之间的所有字符,并且内部不会找到 |