正则表达式学习笔记(三)——重复匹配

1.有多少个匹配

\w@\w\.\w  只能匹配a@b.c 形式,由于\w 只能匹配单个字符

1.1 匹配一个或多个字符

使用+做为后缀,+ 匹配一个或多个字符,至少1个,不匹配0个

例如匹配电子邮箱格式为  text@text.text

文本 Hello,MyEmail is abcd@gmail..com ,xiaoming’sEmail is asdw.gmail.magic.com

正则表达式  \w+@\w+\.\w+

结果

hello,my email is abcd@gmail.com, ,xiaoming’s Email is .sdw.gmail.magic.com

分析:\w可以匹配所有的字母和数字(以及下划线_。这个字符在电子邮件中是合法的),第一个\w+匹配多个字母或数字字符,然后接一个@(@不需要转义),第二个\w+匹配多个字母或数字字符,\.匹配一个.(.需要转义,这里才用的\.)第三个\w+匹配多个字母或数字字符.

 

但是这里我们漏掉了asdw.gmail.magic.com,加入要这两个都匹配出来,可以使用[\w.]+@[\w.]+\.\w+

 

1.1 匹配零个或多个字符

使用*即可。和+类似,但是+至少匹配一次,*可以一次也不匹配。

1.2  匹配0个或一个字符

使用元字符? 

1.3匹配重复次数

 正则表达式的+、*、?解决了很多问题,但是有时候,我们需要精确到某一个次数,正则表达式提供了一个设置次数的语法。

1.3.1 匹配重复次数

{num}匹配num次,例如

文本 1231234 12345 abcde abcedf

正则表达式:\w{5}

结果:123 1234 12345 abcde abce5f

1.3.2为重复匹配设定一个区间

{num1,num2}匹配num1次到num2次之间,例如

文本:aa11aa,aa1aa,bb111bb,bb1111aa

正则表达式:[0-9]{2,4}

结果:aa11aa,aa1aa,bb111bb,bb1111aa

1.3.3 匹配至少重复多少次

{num,}例如:

文本:  123 1234 12345 abcde,abcedfabcdefghijk

正则表达式: \w{4,}

结果: 123 1234 12345 abcde abcedf,abcedfabcdefghijk

1.3.4 防止过度匹配

 

?只能匹配一个字符,{n}和{m,n}也有一个重复次数的上限但是对于其他的,例如+、*等没有一个上限,有时候就会导致过渡匹配的情况,例如下面这个例子

文本: Learn English is important,but in <b>CH</b>AND<b>JP<b>,the teachingis not available.

正则表达式:<[Bb]>.* </[Bb]>

结果: Learn English is important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

分析:显然,这个.*把第第二个</b>和第三个<b>都给一网打尽,虽然没有漏掉我们所需要的文本,但是,这两个b却莫名失踪了,还多匹配了一个and

      为什么会这样呢,是因为*和+都是“贪婪型”元字符,他们在进行匹配时是多多益善的而不是适可而止的。

     解决办法:使用这些元字符的“懒惰型”版本,使其匹配尽可能的少。

 

常见的贪婪型元字符和他们的懒惰型版本

贪婪型元字符

懒惰型元字符

*

*?

+

+?

{n,}

{n,}?

 

 

正则表达式:<[Bb]>.*?</[Bb]>

结果:LearnEnglish is  important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

 

 

posted @ 2017-10-15 23:41  Rainyn  阅读(10310)  评论(0编辑  收藏  举报