更换字符串中的浮点数的问题

时间:2014-11-19 05:12:57

标签: javascript regex replace

我有以下字符串:

'd="M4.125,4 L4.25,1 L4.375,4 L4.5,4.125 L7.5,4.25 L4.5,4.375 L4.375,4.5 L4.25,7.5 L4.125,4.5 L4,4.375 L1,4.25 L4,4.125z" d="M4.125,4 L4.25,2.5 L4.375,4 L4.5,4.125 L6,4.25 L4.5,4.375 L4.375,4.5 L4.25,6 L4.125,4.5 L4,4.375 L2.5,4.25 L4,4.125z"'

我需要提取所有数字(floatint),将它们乘以5并将其替换为结果。

所以我尝试了以下操作:

var x = 'd="M4.125,4 L4.25,1 L4.375,4 L4.5,4.125 L7.5,4.25 L4.5,4.375 L4.375,4.5 L4.25,7.5 L4.125,4.5 L4,4.375 L1,4.25 L4,4.125z" d="M4.125,4 L4.25,2.5 L4.375,4 L4.5,4.125 L6,4.25 L4.5,4.375 L4.375,4.5 L4.25,6 L4.125,4.5 L4,4.375 L2.5,4.25 L4,4.125z"'
var reg = /(\d\.*\d{0,3})/g
var match = x.match(reg);

for (i = 0; i < match.length; i++) {
    x = x.replace(new RegExp(match[i], 'g'), match[i] * 5)
}

console.log(match)
console.log(x)

正则表达式很好。它提取所有数字。问题出在.replace()函数上。

将其记录为match

Array [ "4.125", "4", "4.25", "1", "4.375", "4", "4.5", "4.125", "7.5", "4.25", 38 more… ]

这适用于x

"d="M20.3025,20 L20.25,5 L20.375,20 L20.5,20.3025 L337.5,20.25 L20.5,20.375 L20.375,20.5 L20.25,337.5 L20.3025,20.5 L20,20.375 L5,20.25 L20,20.3025z" d="M20.3025,20 L20.25,112.5 L20.375,20 L20.5,20.3025 L30,20.25 L20.5,20.375 L20.375,20.5 L20.25,30 L20.3025,20.5 L20,20.375 L112.5,20.25 L20,20.3025z""
     ^^^^^^^     ^^^^^    ^^^^^^     ^^^^ ^^^^^^^  ^^^^^ ^^^^^  

正如您所看到的,第一个数字是20.3025,但我预计它会是20.625

字符串x中的数字应替换为以下数字。

Array [ 20.625, 20, 21.25, 5, 21.875, 20, 22.5, 20.625, 37.5, 21.25, 38 more… ]

我做错了什么?另外,如果有任何简单的方法,请告诉我。

1 个答案:

答案 0 :(得分:3)

这是因为你为匹配元素使用了一个循环。有了它,您可以为{em>每个匹配元素重复x的替换操作。循环的每次迭代都应用于已更改的 x字符串,因此最终结果不符合您的预期。

如果您将match[i]的te值转换为Number,并使用更直接/更简单的方法替换字符串中的数字,则此方法有效。

var x = 'd="M4.125,4 L4.25,1 L4.375,4 L4.5,4.125 L7.5,4.25 L4.5,4.375 '+
        'L4.375,4.5 L4.25,7.5 L4.125,4.5 L4,4.375 L1,4.25 L4,4.125z" '+
        'd="M4.125,4 L4.25,2.5 L4.375,4 L4.5,4.125 L6,4.25 L4.5,4.375 '+
        'L4.375,4.5 L4.25,6 L4.125,4.5 L4,4.375 L2.5,4.25 L4,4.125z"';
var reg = /(\d\.*\d{0,3})/g
var match = x.match(reg);
var report = document.querySelector('#result');

report.innerHTML = 'x initially: '+x+'<hr>';

// a more simple approach
x = x.replace(reg, function(a) {return +a * 5;});

report.innerHTML += 'x after: '+x + '<hr>match: '+match.join(', ');
<div id="result"></div>