JS - Regex替换在一次调用中多次发生,如何让它运行一次?

时间:2016-03-16 15:19:50

标签: javascript regex string

我有一个字符串

Yes (+1500)

我希望将(+ $1500)替换为(+ $1700)(或- $1700,或0,或任何数字

所以我正在使用此正则表达式进行测试:/\(\+(.+?)\)|\(\-(.+?)\)/

var string = 'Yes (+ $1500)';
string.replace(/\(\+(.+?)\)|\(\-(.+?)\)/, '(+ $1700)');

// returns "Yes (+  $1500700)"

如果我尝试使用其他数字,它会返回相似的值

var string = 'Yes (+ $1500)';
string.replace(/\(\+(.+?)\)|\(\-(.+?)\)/, '(+ $1700)');

// returns "Yes (+  $1500700)"
// desired result: "Yes (+ $1700)"

var string = 'Yes (+ $1500)';
string.replace(/\(\+(.+?)\)|\(\-(.+?)\)/, '(- $1700)');

// returns "Yes (-  $1500700)"
// desired result: "Yes (- $1700)"

var string = 'Yes (+ $1500)';
string.replace(/\(\+(.+?)\)|\(\-(.+?)\)/, '(- $12345)');

// returns "Yes (-  $15002345)"
// desired result: "Yes (- $12345)"

我认为这是因为正则表达式命令/\(\+(.+?)\)|\(\-(.+?)\)/从字符串Yes (+ $1500)返回多个匹配项:

var string = 'yes (+ $1500)';
/\(\+(.+?)\)|\(\-(.+?)\)/.exec(string);

// returns: 
//     ["(+ $1500)", " $1500", undefined]

所以我认为有一些奇怪的地方.replace看到2个或更多匹配到regex命令,并试图替换它们。

.replace()会替换多个匹配项吗?

这是我的正则表达式命令的正则表达式示例:https://regex101.com/r/qH0sR1/1

1 个答案:

答案 0 :(得分:0)

您需要在替换字符串中加倍$,您只需使用[-+]字符类来匹配-+

var string = 'Yes (+ $1500)';
document.body.innerHTML = string.replace(/\(([+-])[^)]*\)/, '($1 $$1700)');

请参阅regex demo here$必须加倍,因为它应该转义表示反向引用的$

  • \( - 匹配(
  • ([+-]) - 匹配并捕获到第1组+-
  • [^)]* - 匹配)
  • 以外的0 +个字符
  • \) - 文字)

可以进一步改进模式,例如/\(([+-])\s*\$\d+\)//\(([+-])\s*\$?\d+\)/。如果您需要进行多次替换,请添加/g修饰符。