全局正则表达式不匹配背靠背模式

时间:2017-12-13 18:56:44

标签: javascript regex

我正在尝试将一个正则表达式放在一起,以便在将某些数据传递到图表引擎之前将其过滤掉。我遇到了一个问题,我需要匹配的模式部分重叠。

以下是一个例子:

样本数据

{name:'race1',data:[0,2,12,20,9]},{name:'race2',data:[9,23,32,19,8]},{name:'race3',data:[1234,1000,1211,980]}

我需要删除10以下的所有值,并尝试以下操作:

sampledata.replace(/([,\[])\d([,\]])/g,'$1NO$2')
//Returns {name:'race1',data:[NO,2,12,20,NO]},{name:'race2',data:[NO,23,32,19,NO]},{name:'race3',data:[1234,1000,1211,980]}

sampledata.replace(/(?:[,\[])\d(?:[,\]])/g,'$1NO$2')
//Returns {name:'race1',data:$1NO$22,12,20$1NO$2},{name:'race2',data:$1NO$223,32,19$1NO$2},{name:'race3',data:[1234,1000,1211,980]}

但都忽略了第二场比赛。我认为这种情况正在发生,因为第一场比赛将抓住[0,并且第二场比赛被跳过,因为我需要它来抓取,2,,但第一场比赛已在上一场比赛中使用过。我不知道如何告诉它重用该模式的那一部分。我尝试使用?:忽略该组,但这似乎只是从替换字符串列表中忽略它。

以下是我需要的结果:

{name:'race1',data:[NO,NO,12,20,NO]},{name:'race2',data:[NO,23,32,19,NO]},{name:'race3',data:[1234,1000,1211,980]}

1 个答案:

答案 0 :(得分:0)

当您使用.replace(/([,\[])\d([,\]])/g,'$1NO$2')时,您匹配并使用带有]模式的逗号或([,\]]),并且在下一次使用([,\[])时,该第二次无法匹配该字符迭代。

要替换未包含在其他数字中的所有数字,您可以使用

s = s.replace(/(^|\D)\d(?!\d)/g,'$1NO');

请参阅regex demo

<强>详情

  • (^|\D) - 匹配(消耗)并捕获到第1组字符串开头(^)或任何非数字字符(\D
  • \d - 一位数字
  • (?!\d) - 没有立即跟随另一个数字。

如果您打算仅在方括号内替换此类数字(使用/\[[^\][]+]/g或 - 仅将[...]与逗号分隔的数字/\[([\d,]+)]/g)匹配,则首先匹配{{1然后替换匹配中的数字:

&#13;
&#13;
[...]
&#13;
&#13;
&#13;