正则表达式匹配重复的字符串
1.用正则匹配字符串中重复的字符或符号,不限制重复的次数:
var str="aabb..ccee!!!";
var reg=/(.)\1+/ig;
//获取匹配到的重复的字符串或符号:
var str_match=str.match(reg); //结果为:(6) ["aa", "bb", "..", "cc", "ee", "!!!"]
//把匹配到的重复的字符串或符号替换为单一的:
var str_replace=str.replace(reg,"$1"); //结果为:ab.ce!
在上面的代码里:
== \1 表示的是正则里,第一个小括号捕获到的内容。==
2.匹配类似“ABBB”结构的字符串:
也就是以一个字符开头,后面跟着几个不同的重复的字符,如 abb,cdd,egggg等。
var str="AbbbCdd+!!";
var reg=/(.)(?!\1)(.)\2+/ig;
//获取符合“ABBB”结构的内容:
var str_match=str.match(reg); //结果为:(3) ["Abbb", "Cdd", "+!!"]
//如果要把重复的字符串替换成一个,还要用上面的正则,不能用这里的正则:
var str_replace=str.replace(/(.)\1+/ig,"$1"); //结果为:AbCd+!
(?!n) 是正则里的一个“语法结构”,是非获取匹配,表示"负向预查",意思就是说"后面不能…",并且不捕获这个小括号匹配到的内容。
类似的用法还有:(?:n) 、 (?=n) ,更详细的内容,可以看这篇文章,里面有具体的实例,解释的很清楚:
jquery正则中问号的三种[说四种那是忽悠人]用法详解及在线实例演示
(.)(?!\1)(.)\2+ :用直白的话来解释,就是匹配一位任意字符,它的后面不是和它相同的字符,再后面是任意一个重复一次或多次的字符。
3.匹配指定位数的重复:
比如,我们要匹配手机号中间四位相同的手机号:
var str="17788888234";
var reg=/1\d{2}(\d)\1{3}(?!\1)\d{4}/gi;
document.write(reg.test(str));
下面,来详细解析一下这个正则:1\d{2}(\d)\1{3}(?!\1)\d{4}
手机号都是以1开头的,所以第一位就是1
\d{2} 表示两位数字,
(\d) 表示一位数字,用小括号括起来表示“捕获”,捕获后,可以用“\1”"\2"来引用,
\1{3} 表示捕获第一个用小括号括起来的内容,并且重复三次,综合起来就是四个连续相同的数字。
(?!\1) 这是正则里的一个“语法”,小括号不表示“捕获”,详细的可以看上面的那个实例。这一句表示后面的数字不能和前面捕获的数字相同。
4.匹配不能重复:
上面说了正则里和“重复”或“相同”相关的内容,下面再来说说正则里“禁止重复”“不能相同”的情况:
实例1:判断数字是否为六位不同的数字组成的数字:
简单的说,就是组成数字的六位数字,都必须为不同的数字,不能有相同的数字。
var str="123465";
var reg=/^(?!\d*?(\d)\d*?\1)\d{6}$/gi;
document.write(reg.test(str));
下面来讲解分析下上面这个正则: ^(?!\d*?(\d)\d*?\1)\d{6}$
^ 表示开头;
(?!) 是正则里的一个“语法结构”,表示“断言后面不是…”的意思;
\d*?(\d)\d*?\1 这一句是难点,表示“重复的数字”的意思,用语法来详细解释的话,还真不好解释,因为这一句的逻辑性太强,我试着来解释下吧:
我们把它分开看,\d*?(\d)\d*? 这一句,表示不定位数的数字,
\d表示一个数字,
*表示0或多次,
?表示零或一次,
*? 也可以合在一起解释为 匹配零或多次,但尽可能少匹配。
\d*? 合在一起,意思就是“空”或者任意位数的数字。
(\d) 上面说过,就是匹配一位数字,并用括号捕获,
所以综合起来看的话,\d*?(\d)\d*? 这一句几乎可以匹配到任何的数字,但后面再加上 “\1” 后,也就是正则“\d*?(\d)\d*?\1” 表示的意思就是有重复的数字。
比如:121 前两位会被正则 “\d*?(\d)\d*?\1” 红色的部分匹配到,1是捕获到的。
233 前两位会被 “\d*?(\d)\d*?\1” 红色的部分匹配,3是捕获到的。
42313 前四位,会被“\d*?(\d)\d*?\1” 红色的部分匹配,3是捕获到的。
(?!\d*?(\d)\d*?\1) 这一句,综合起来解释的意思就是,设定后面的数字,都是不重复的数字的意思。
摘自 爱jQuery:http://www.aijquery.cn/Html/jqueryjiqiao/181.html