正则表达式重复匹配

[b]重复匹配[/b] 正则表达式中匹配多个字符的办法就是通过使用集中特殊的元字符来做到。


1. 匹配一个或多个字符,使用元字符+。

(1) + 可以用来匹配一个活多个字符集合,如:\w+ \d+ \w+@\w+.\w+ [\w\.]+

在此,再强调一个概念: 字符集就是存在于[]中间的内容。[]的常规用法是吧多个字符定义为一个集合


[0-9]+ 匹配一个活连续出现的数字


2. 匹配零个或者多个字符,使用元字符*; 在正则表达式中*和+的用法完全一样--->只要把它放在一个字符或者一个字符集的后面,就可以生效。

如: [\w.]+[\w.]+\.\w+ ----> [\w]+[\w.]*@\.\w+


3. 匹配零个或者一个字符, 使用元字符?

如: [\r]?\n[\r]?\n



4. 匹配重复的次数,设置重复次数需要使用{和},把相关值填入即可。

(1) 为重复匹配次数设定一个精确的值,把数字写在{}中间;{3} 意味着模式里的前一个字符或者字符集合必须在原始文本里连续重复出现3次才算一个匹配。


(2) 为重复匹配次数设定一个区间,如{3,5}含义是最少重复3次,最多5次。

例子:匹配日期的多种格式\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}

注意: 例子中使用/ 的转义序列\/. 这在有些正则表达式分析器中要求必须这样做,有的是不必要的; 为了避免不必要的麻烦最好总使用期转义序列。

5. 匹配"至少重复多少次" 即{}中省略了最大值部分,例如:{3,}

例子: 文本 1001: $496.90 1009: $26.54 1004 $323.00 \d+:\$\d{3,}\.\d{2}


容易忽视的:[b]过度匹配[/b]

?只能匹配零个或一个字符,{n}和{m,n}也有一个重复次数的上限; 但是其它的重复匹配语法在重复次数方面都灭有上限值,而这样走有事会导致过度匹配的现象。

[b]过度匹配实例:[/b]

在下面的文本中把<B>标签里的文本匹配出来(为了对这些文本进行替换或其它)

I should offer u his hand in the marriage at any time if u want. U can hold the wedding in <B>UK</B> and <B>HK</B>.

匹配的正则表达式是:<[Bb]>.*</[Bb]> 得到的结果是

<B>UK</B> and <B>HK</B>.

[b]原因是:[/b]

*和+都是所谓的"贪婪型"元字符,它们在进行匹配是的行为模式是多多益善而不是适可而止的。它会尽可能低从一端文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配是为止。

[b]解决办法是采用"懒惰型"写法(匹配尽可能少的字符)[/b]

"懒惰型"元字符写法很简单,只要给贪婪心元字符加上一个?后缀即可。

[/code]
[code="java"]
贪婪型 对应的 懒惰型
* *?
+ +?
{n,} {n,}?

[b]特别提醒: 请务必根据具体情况来选用"贪婪型"或"懒惰型"元字符。[/b]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值