正则表达式匹配重复的字符串[超详细]附完整实例推荐 亲测 原创 收藏

文章标签: jquery正则
  • :
  • 03-09 20:21
  • :
  • 68次
  • :
  • 0条
  • 3赞

简介使用正则表达式来匹配获取重复字符的各种方法,及完整实例。

本文站长和大家总结整理一下,在正则表达式里,和“匹配获取重复字符串”相关的内容。

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)  这一句,综合起来解释的意思就是,设定后面的数字,都是不重复的数字的意思。



您正在找的文章可能是: