[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]