Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字符串替换为regexp将覆盖不匹配的字符_Javascript_Regex - Fatal编程技术网

Javascript 字符串替换为regexp将覆盖不匹配的字符

Javascript 字符串替换为regexp将覆盖不匹配的字符,javascript,regex,Javascript,Regex,其想法是将所有小数点前没有数字的十进制数替换为零,这样.03 sqrt(.02)将变成0.03 sqrt(0.02) 有关示例,请参见下面的代码,问题是当小数点前有一个圆括号时,替换将覆盖圆括号。我认为括号不属于匹配字符串,是吗 s='.05 sqrt(.005)另一个(.33)这不应该改变(a.b)也不应该改变(3.4)' s=s.replace(/(?:^|\D)\.(\D+)/g,“0.1美元”); console.log使您的初始组捕获而不是非捕获,并在替换中使用它: s=s.repl

其想法是将所有小数点前没有数字的十进制数替换为零,这样
.03 sqrt(.02)
将变成
0.03 sqrt(0.02)

有关示例,请参见下面的代码,问题是当小数点前有一个圆括号时,替换将覆盖圆括号。我认为括号不属于匹配字符串,是吗

s='.05 sqrt(.005)另一个(.33)这不应该改变(a.b)也不应该改变(3.4)'
s=s.replace(/(?:^|\D)\.(\D+)/g,“0.1美元”);

console.log
使您的初始组捕获而不是非捕获,并在替换中使用它:

s=s.replace(/(^|[^\d])\.(\d+)/g , "$10.$2");
//           ^---- capturing, not non-capturing
例如:

s='.05 sqrt(.005)另一个(.33)这不应该改变(a.b)也不应该改变(3.4)'
s=s.replace(/(^[^\d])\(\d+)/g,“$10.$2”);

console.log
括号是nn位,因此它与
[^\d]
匹配并删除

解决方案是匹配并捕获圆点之前的零件,然后使用替换的反向参考插入

使用

图案细节

  • (^ |\D)
    -捕获组1(稍后从替换模式中用
    $1
    引用):字符串或任何非数字的开头(
    [^\D]
    =
    \D
  • \。
    -一个点
  • (\d+)
    -捕获第2组(后面用替换模式中的
    $2
    引用):1+位数
请参阅JS演示:

s='.05 sqrt(.005)另一个(.33)这不应该(a.b)也不应该(3.4)'
s=s.replace(/(^\D)\(\D+)/g,“$10.$2”);

console.log
为了清晰起见,请使用反勾号而不是黑体来调用内联代码。使用
s.replace(/(^\124;\ D)\.(\D+)/g,“$10.2”)
您不必将单个标记
\D
放入字符类,
[\D]
=
\D
@Wiktor,谢谢。我将编辑以更清楚地说明问题的要点
.replace(/(^|\D)\.(\d+)/g , "$10.$2")