有多少个匹配

匹配一个或者多个字符

例一

目的 :匹配文本中的邮箱地址

**使用元字符+ **

用法

在字符或者字符集后面简单的加上一个“+“,则可匹配 至少一个符合该字符模式的字符

正则表达式 :[\w.]+@[\w.]+\.\w+

使用元字符+

注意

1
2
3
4
5
注意 细心的读者可能已经注意到了:我们没有对字符集合[\w.]里
的.字符进行转义。尽管如此,它还是把原始文本里的.字符匹配出来
了。一般来说,当在字符集合里使用的时候,像.和+这样的元字符将
被解释为普通字符,不需要被转义——但转义了也没有坏处。[\w.]
的使用效果与[\w\ .]是一样的。

匹配零个或者多个字符

例二

目的

1
2
3
4
5
匹配出合法的邮箱地址(邮箱地址开头不能以`.` 开头,
所以我们的正则表达式需要 可以去匹配出第一个字母或数字,
同时”@“前面也可以只有那**一个**合法字符,而不需要再出现 多个字母数字,
也就是**第一个**合法字符之后的 **字符**是可(**多**)有可**无**的)

使用元字符:*

用法与+一致

正则表达式\w[\w.]*@[\w.]+\.[\w]+

使用元字符*


匹配零个或者一个字符

目的匹配https或者http

使用元字符?

?将匹配一个或零个字符或者字符集一次或零次


使用元字符?

例三

目的

1
2
3
仔细体会?与+和*的相似和区别
之处。如果需要在一段文本里匹配某个特定的字符(或字符集合)而该
字符可能出现、也可能不出现,?无疑是最佳的选择。

例四匹配指定次数

目的 匹配日期格式

使用元字符{}

用法

1
2
3
4
{}里面天的数字为所指定的匹配次数
或者
数字区间{x1,x2}(即最少x1次,最多x2次)

正则表达式\d{1,2}[/-]\d{1,2}[-/]\d{0,4}

使用元字符{}



综合例五

目的使用一个正则表达式把所有大于或等于$100美元的金额找出来

使用{x,}

正则表达式\d+: \d{3,}\.\d{2}

使用{x,}


例六

目的防止过度匹配

参考表格

贪婪型元字符 懒惰型元字符
* *?
+ +?
{n,} {n,}?

贪婪的例子

贪婪的例子

分析

1
2
3
4
5
6
7
8
9
<[Bb]>匹配<B>标签(大小写均可),</[Bb]>匹配</B>标签(也是大
小写均可)。但这个模式只找到了一个匹配而不是预期中的两个:第一
个<B>标签之后、最后一个</B>标签之前的所有东西——AK</B> and
<B>HI——被.*一网打尽。虽然没有漏掉我们想要匹配的文本,但问题
是第2个<B>标签不明不白地“失踪”了。
为什么会这样?因为*和+都是所谓的“贪婪型”元字符,它们在进行匹配
时的行为模式是多多益善而不是适可而止的。它们会尽可能地从一段文
本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到
碰到第一个匹配时为止。

懒惰版改进(加上”?“)


懒惰版改进(加上”?“)


小结

1
2
3
4
5
6
7
正则表达式的真正威力体现在重复次数匹配方面。本章介绍了+(匹配
字符或字符集合的一次或多次重复出现)、*(匹配字符或字符集合的
零次或多次重复出现)、?(匹配字符或字符集合的零次或一次出现)
等几个元字符的用法。要想获得更精确的控制,你可以用{ }语法来精
确地设定一个重复次数或是重复次数的最小值和最大值。元字符分“贪
婪型”和“懒惰型”两种;在需要防止过度匹配的场合下,请使用“懒惰
型”元字符来构造你的正则表达式.