我有以下字符串:
'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"'
我需要提取所有数字(float
和int
),将它们乘以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… ]
我做错了什么?另外,如果有任何简单的方法,请告诉我。
答案 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>