正则表达式学习笔记(三)——重复匹配
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.