Mindon.IDEA

Air off, Mind on ~ / Javascript+Golang, Sci, Health… /

JavaScript之正则表达式 Replace

BlogMS original blog key: 1000515471, blog id: airoff History stat: 浏览/评论:780/0 , 日期:2005年8月10日 13:52

近来一直在研究 SVG,发现软件(如Illustrator)生成的SVG中的数据小数位数太多了,没必要如此精确,于是心想能否自动处理一下里面的数据,让所有的数都四舍五入精简一下,我头一个想到的就是我所熟悉的正则表达式,可我所接触到的javascript中的正则表达式(因为在html中就能执行,故没考虑在Perl或Java中使用)好像还没有能方便处理这种情况的方法,于是今天 google 了一下,但一开始也没看到自己想要的东西,但看到字符串replace方法的时候,心想javascript是不是存在 replace(rexp, function) 的用法,于是,用“javascript regular expression replace function”搜索了一下,果真发现了在mozilla网站上的 Core JavaScript 1.5 Reference 中提到了 replace(rexp, function) 的用法,看了例子后,稍微研究了一下,发现其中 function的参数是这样的:

arguments[0], 匹配的串源

arguments[1] … arguments[arguments.length -3],匹配()内容,相当于常用的 $1, $2…

arguments[arguments.length -2],匹配串的位置偏移 offset

arguments[arguments.length -1],整个字符串源

对于SVG中的某自动生成的点数据,把数据赋值给变量 points:

var points="1.23456,2.34534 3.47804-4.824-5.270213,6.009324";

定义正则表达式

var rexp = /(-?[0-9]+(.([0-9]+))?)/g;

通过

points = points.replace(rexp, function(){

return Math.floor(parseFloat(arguments[1])*100 +0.5)/100;

});

最后得到的 points="1.23,2.35 3.48-4.82-5.27,6.01",正是我想要的效果。玩了好几年的JavaScript,其实也有碰到过类似的问题,竟然没发现 replace 的这个功能,真是遗憾。

(这里的例子取了两位小数,其实对于精度要求不是太高的SVG里,一位小数应该就足够了。)

Comments