在我当前的任务中,我正在设置SVG路径的坐标,因此我尝试以编程方式根据用户更改的偏移量更改其值。坐标是丑陋的属性,其值看起来像这样:
M0,383c63,0,89.3,-14.1,117.4,-65.9 ...
如果偏移量为100,则新值可能需要如下所示:
M0, 483 c63,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 ):
我通过切换parens来生成“反向”正则表达式,最终看起来像/(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技能,我根本无法从上述链接问题的答案中推断出来。)
<小时/> 警告:在{S.}这似乎回答了如何对特定对进行多次替换,但他们似乎假设全局替换,并且我无法保证匹配/捕获的数字在字符串中是唯一的。
< / p>
答案 0 :(得分:1)
我不是制作一个巨大的复杂模式来查找和替换您正在寻找的所有内容,而是迭代每个项目并逐个替换它们。正则表达式如下所示:
在此正则表达式中,{1}
是您要跳过的逗号分隔值的数量。在这种情况下,我们正在跳过第一个并仅替换第二个字符串中的前导数字。
^(,?[^,]*){1},([0-9]+)
替换以下内容,其中_XX_
是所需的新值。
$1,_XX_