【问题标题】:replace regex captures with values from an array (javascript)用数组中的值替换正则表达式捕获(javascript)
【发布时间】:2016-05-03 09:17:29
【问题描述】:

在我当前的任务中,我正在为 SVG 路径的坐标设置动画,因此我尝试根据用户更改的偏移量以编程方式更改它们的值。坐标是丑陋的属性,其值看起来像这样:

M0,383c63,0,89.3,-14.1,117.4,-65.9...

对于 100 的偏移量,新值可能需要如下所示:

M0,483c63,0,89.3,-14.1,217.4,-65.9...// without the bold (it's just there to highlight diff)

我为不同的路径传递不同的正则表达式,例如,/long(N)and...N...ugly(N)regex/,但每条路径都有不同的捕获量(我也可以传递那个数量)。使用answers here 和一个循环,我想出了如何以编程方式创建一个新更改值的数组(不管捕获的数量),给我类似['483','217.4',...] 的东西。

我的问题是,我如何以编程方式将更改后的数字替换/注入回字符串中(如上一行中的粗体数字)?


我目前的解决方法 (and a fiddle):

我通过切换括号来生成“反向”正则表达式,最终看起来像/(long)N(and...N...ugly)N(regex)/。然后我手工做东西,例如:

if (previouslyCapturedCount == 3) {
  d = d.replace(reverseRE, "$1" + dValuesAltered[0] + "$2" + dValuesAltered[1] + "$3" + dValuesAltered[2] + "$4");
} else if (previouslyCapturedCount == 4) {
  // and so on ...

但是一定有更好的方法,不是吗? (也许由于我缺乏 JS Skillz,我根本无法从上述链接问题的答案中推断出来。)


警告:Thereareseveralquestionshere 在 S.O.这似乎回答了如何对特定对进行多次替换,但它们似乎假设全局替换,并且我不保证匹配/捕获的数字在字符串中是唯一的

【问题讨论】:

  • @WiktorStribiżew 不是 MCVE 吗? ;)
  • 六个一个,六个另一个
  • 添加了一个小提琴以希望满足 MCVE 要求。抱歉,如果问题中的抽象/省略令人讨厌。只是我经常发现那些“代码墙”问题令人讨厌。 :-)

标签: javascript arrays regex


【解决方案1】:

与其创建一个巨大的复杂模式来查找和替换您正在寻找的所有内容,我会迭代每个项目并一次替换它们。使用如下所示的正则表达式:

在此正则表达式中,{1} 是您希望跳过的逗号分隔值的数量。在这种情况下,我们将跳过第一个并仅替换第二个字符串中的前导数字。

^(,?[^,]*){1},([0-9]+)

替换为以下内容,其中_XX_ 是所需的新值。

$1,_XX_

【讨论】:

  • 祝福你回答了我被否决的问题(并解释了 {1} 之类的东西,我有一段时间没见过了)。我发誓我试图根据你的回答努力得到一些东西,但即使经过一夜的休息,它也让我的非程序员头疼,哈哈,尽管这可能是一个更好的起点,因为我已经完成了疯狂的正则表达式,这比现在使用我的解决方法要付出更多的努力。也许我会在喝完咖啡后再试一次。再次感谢您!
  • 所以关于你的 OP,你说你有一个 100 的偏移量,然后你的字符串中的一些子值发生了变化。决定更改哪些子值的标准是什么?此外,听起来您可能已经找到了解决方案,如果是这样,那么您应该发布您的解决方案作为您自己问题的答案。
  • 更改的子值相当随意;在制作 SVG (bleh) 后,我必须手动确定哪些需要更改。我对 OP 中的重新注入问题的“解决方案”只是一种解决方法(我手动为每个 captureCount 写出if (captureCount == 3) { ...,而不是更像一个单线)。我想我更大/一般的问题是,给定一个正则表达式,是否有可能以编程方式用稍微改变的值替换捕获。而且我认为制作这个数组让我成功了一半(尽管这可能是一个不必要的步骤)。
  • FWIW,我认为您的回答很有用,因为它可以帮助我想到完全不同的方式来做我需要做的事情,这些方式是我以前没有想到的。我还在学习。
猜你喜欢
  • 2019-01-27
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2010-11-19
  • 2013-06-27
相关资源
最近更新 更多