有一个字符串,里面都是用',(逗号)'隔开的数字,只有一个数字出现了1次,其他所有数字都出现了2次。我如何通过正则匹配或者替换的方式,提取出这个只出现过1次的数字。
例如:
1.var一个字符串str和正则表达式re
var str = '112,112,1,1,3,3,234,234,4,22,22';
var re;
2.如何通过正则匹配或者替换,改变str的值为'4'
str = str.match(re);
或者
str = str.replace(re,'');//想让str值为'4'
正则并不合适作这样的事~,还是用循环吧~~
var str = '8,999,112,112,1,88,1,3,3,88,234,234,4,22,999,22';
var arr = str.split(',');
var d = {};
for(x in arr){d[arr[x]]=d[arr[x]] ? d[arr[x]]+1 : 1;}
arr=[];
for(x in d){if (d[x]==1){arr.push(x);}}
console.log(arr);
["4", "8"]
第一个问题:提取出只出现过 1 次的数字
'112,112,1,1,3,3,234,234,4,22,223'.replace(/\d{3}(,|$)/g, function(e) { // 这里我只判断了其中一种情况(第一个数与第二个数相等,但第三个数不一样时)以作示范 if (e[0] === e[1]) { if (e[0] !== e[2]) { if (e[3] === ",") { return e[0] + e[1] + "(" + e[2] + ")" + e[3]; } else { return e[0] + e[1] + "(" + e[2] + ")"; } } } return e; }); result:11(2),11(2),1,1,3,3,234,234,4,22,22(3)
第二个问题:改变 str 的值为'4'
str.replace(/.*/, "4");
如果是先提取 4,再改变的话,上面已经有答案了。
str += ','; str.replace(/(d+,)\1+/g, '').replace(/,$/, '');
var str = '112,112,1,1,3,3,234,234,4,22,22'; var re=/(.*?),\1/g; console.log(str.replace(re, ''));
var str = '112,112,1,1,3,3,234,234,4,22,22'; str += ','; var result = str.replace(/(\d+\,)\1+/g, ''); // 匹配连续多个'ddd,' console.log(result); // '4,' result = result.replace(/\,$/, ''); // 去掉结尾',' console.log(result); // '4'
正则匹配需要视实际情况而定,比如说:
var pattern1 = /\d+(?!,)$/g; var pattern2 = /\d+$/g; var str = '112,112,1,1,3,3,234,234,4'; console.log(str.match(pattern2)); //["4"] 或者直接这样: str.replace(/\d+,/g, ''); //'4' 更改题目后: 如果说其他所有数字都出现了2次都是挨着的,楼下的写法OK。 str += ','; str.replace(/(d+,)1+/g, '').replace(/,$/, ''); 如果不挨着,就不行,那就先处理下 var arr = str.split(','); arr.sort(); str = arr.join(','); str += ','; str.replace(/(d+,)1+/g, '').replace(/,$/, '');
我这个总结或许能帮到一下:
js正则表达式