正则表达式-重复匹配
1.重复匹配
1.1匹配一个或多个字符
要想匹配同一个字符(或字符集合)的多次重复,只要简单地给这个字符(或字符集合)加上一个+字符作为后缀就行了。+匹配一个或多个字符(至少一个:不匹配0个字符的情况)。
例1
比如我想匹配文本里所有的邮箱
#文本
#文本
Send e-mail to Tom and Ada, their mailbox is 1944786548@qq.com and .18755518273@163.com,
don't forget, Green's mailbox is green.sun@126.com, and finally my mailbox, ben@urgent.forta.com
#正则表达式
\w+@\w+\.\w+
#结果
Send e-mail to Tom and Ada, their mailbox is 1944786548@qq.com and . 18755518273@163.com,don't forget, Green's mailbox is green.sun@126.com, and finally my mailbox,ben@urgent.forta.com
正则表达式匹配了4个邮箱,但其中两个不够完整,还有一个是错误的邮箱。(邮箱地址可以有任意多个字符,但第一个字符必须是一个字母或数字字符)下面我们学习另一种元字符来完成我们的任务。
1.2匹配零个或多个字符
+匹配一个或多个字符,但不匹配0个字符,如果我们想匹配一个可有可无的字符,也就是这个字符可以出现0次或多次,那么我们就需要用*元字符来完成匹配。
例1
#文本
Send e-mail to Tom and Ada, their mailbox is 1944786548@qq.com and .18755518273@163.com,
don't forget, Green's mailbox is green.sun@126.com, and finally my mailbox, ben@urgent.forta.com
#正则表达式
\w+[\w.]*@[\w.]+\.\w+
#结果
Send e-mail to Tom and Ada, their mailbox is 1944786548@qq.com and . 18755518273@163.com,don't forget, Green's mailbox is green.sun@126.com, and finally my mailbox,ben@urgent.forta.com
现在我们可以看到4个邮箱都正确的匹配了。
1.3匹配零个或一个字符
?元字符,只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次。
例1
#文本
The URL is http://www.forta.com/,to connect securely
use https://www.forta.com/ instead.
#正则表达式
https?://[\w./]+
#结果
The URL is http://www.forta.com/,to connect securelyuse https://www.forta.com/instead.
https?可以匹配https也可以匹配http达到了我们想要的效果。
2.匹配的重复次数
想要指定重复次数,就需要{}元字符给出。比如,{3}意味着模式里的前一个字符或字符集合必须在原始文本中连续出现3次才算一个匹配。{2,4}的含义是最少重复2次,最多重复4次。{3,}表示至少重复3次。
例1
我们想找出金额大于$100的订单
#文本
1001: $123.34
1002: $1349.23
1003: $34.23
1004: $345.34
1005: $91.34
#正则表达式
\$\d{3,}\.\d{2}
#结果
1001: $123.34
1002: $1349.23
1003: $34.23
1004: $345.34
1005: $91.343防止过度匹配
例1
#文本
<B>AK</B> and <B>HI</B>
#正则表达式
<B>.*</B>
#结果
<B>AK</B>and <B>HI</B>上述结果将<B>AK</B> and <B>HI</B>全部匹配了,这是因为第一个<B>到最后一个</B>之间的所有东西都被.*一网打尽。造成这样的原因是*和+都是所谓的”贪婪型”元字符,他们在进行匹配时,是多多益善而不是适可而止。这时我们需要使用这些元字符的”懒惰型“。
贪婪型 | 懒惰型 |
* | *? |
+ | +? |
{n,} | {n,}? |
例2
#文本
<B>AK</B> and <B>HI</B>
#正则表达式
<B>.*?</B>
#结果
<B>AK</B> and <B>HI</B>