JS - 正则表达式替换在一次调用中发生多次,如何让它运行一次

JS - Regex replacing happens multiple times in one call, how do I get it to run once?

本文关键字:一次 运行 调用 正则表达式 替换 JS      更新时间:2023-09-26

我有一个字符串

Yes (+1500)

我想用(+ $1700)(或- $1700,或0,或任何数字)替换(+ $1500)

所以我正在用这个正则表达式进行测试:/'('+(.+?)')|'('-(.+?)')/

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 个或更多与正则表达式命令匹配,并尝试替换它们。

.replace()替换多个匹配项还是仅替换一个匹配项?


这是我的正

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

您需要

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

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

在此处查看正则表达式演示。$必须加倍,因为它应该转义表示反向引用的$

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

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