如:0.123. -> 0.123
0.1.2 -> 0.12
1..2 -> 1.2
1.2...5 -> 1.25
等
哈哈, 想到了,这个正则表达式你值得拥有:
Pattern: (\d)(\.)(\d*)(\2*)(\d*)
思想是找出第一个 .
后面的所有 .
然后如果你是用C#的话,直接用Replace方法换成Replace(text, "$1$2$3$5");
就很beautiful 了。JS的话,用Replace方法类似,具体如何使用,你应该知道吧。不知道的话,回复再给你个Demo
下面是我测试的截图:
"12..3.5646".replace(new RegExp(/(\d)(\.)(\d*)(\2*)(\d*)/g), '$1$2$3$5')
12.3.5646
"12.3.56.46".replace(new RegExp(/(\d)(\.)(\d*)(\2*)(\d*)/g), '$1$2$3$5')
"12.3.56..46".replace(new RegExp(/(\d)(\.)(\d*)(\2*)(\d*)/g), '$1$2$3$5')
@kingreatwill: 我晚上回去再改进一下。
@kingreatwill: 目前只想到了这个:
正则表示式改为 (\d+)(\.)(\d*)(\2*)(\d*)
,然后每个字符串遍历这个替换直至表达式中只有一个 .
,但这个对于大量数据明显不适用。小部分还可以用用。
@BUTTERAPPLE: "12.3.56.46".replace(new RegExp(/(\d+)(\.)(\d*)(\2*)(\d*)/g), '$1$2$3$5')
->"12.356.46"
好像也没有用
@kingreatwill: 让结果再遍历一遍 replace
1 var str = ['0.123.', '0.1.2', '1..2', '1.2...5']; 2 for (var i = 0, n = str.length; i < n; i++) { 3 var flag = true; //第一个不替换 4 var value = str[i].replace(/\./ig, function (a, b, c) { 5 if (!flag) { //不是第一个则返回空 6 return ""; 7 } else { 8 flag = false; //在第一次设置标识并返回. 9 return "."; 10 } 11 }); 12 console.log(str[i] + ":" + value); 13 }
或者这样:
1 var str = ['0.123.', '0.1.2', '1..2', '1.2...5']; 2 for (var i = 0, n = str.length; i < n; i++) { 3 var value = str[i].replace(/\./ig, function (a, b, c) { 4 return c.indexOf(a) == b ? '.' : ''; 5 }); 6 console.log(str[i] + ":" + value); 7 }
'0.1.2'.replace(/(\.[^.]*)./,'$1')
有问题: '0.1'.replace(/(.[^.]*)./,'$1') 会输出0.
'0.1'.replace(/(.[^.]*)./,'$1')