嗯,到了这时候,估计你该有一个疑问了,前面的搜索,貌似一次只能搜到一个字符或者一个单词,比如那个 Call me if you want: 889-45628 的例子,用 \d 倒是可以搜索到电话号码,但是……搜索结果是 8,8,9,4,5,6,2,8 这样的,太矬了吧?就不能一次把整个电话号码提取出来么?
当然可以了,看完本章,你就会了。
表达式 | 含义 | 例子 |
---|
* | 0次或多次。 等价于{0,}。 | 原始字符串:Call me if you want: 889-45628- 正则表达式:\d*-\d*-\d* 搜索结果:889-45628- 解释:\d 搜索数字,*限定该数字出现 0 次或者多次。 |
+ | 1 次或多次。 等价于 {1,}。 | 原始字符串:Call me if you want: 889-45628- 正则表达式:\d+-\d+-\d+ 搜索结果:无 解释:咦?为什么搜不到结果呢?因为 + 限定数字必须出现 1 次或者多次,但是原始字符串最一个 – 字符后面没有数字出现,所以不匹配正则表达式,所以就搜不到结果喽~,如果将正则表达式改写成 \d+-\d+- 就可以了。 |
? | 0 次或 1 次。 等价于 {0,1}。 | 原始字符串:Good morning, fellows. 正则表达式:oo? 搜索结果:参见粗体字 解释:待搜索的字符是一个 o 后面要跟零个或者一个 o,所以 Good 中的 oo,morning 中的 o 以及 fellows 中的 o 都与表达式匹配。 |
{n} | 由数字 n 指定次数 | 原始字符串:Good morning, fellows 正则表达式:o{2} 搜索结果:参见粗体字 解释:本正则表达式限定了 o 要出现 2 次,所以结果只有 Good 中的 oo 匹配。 |
{n,} | 最少 n 次 | 原始字符串:Good morning, fellows. 正则表达式:o{1,} 搜索结果:参见粗体字 解释:本表达式指定 o 至少要出现 1 次,所以 Good 中的 oo,morning 中的 o 以及 fellows 中的 o 都与表达式匹配。 |
{n,m} | 最少 n 次,最多 m 次 | 原始字符串:Good morning, fellows. 正则表达式:o{1,2} 搜索结果:本表达式指定 o 要出现 1 到 2 次,所以 Good 中的 oo,morning 中的 o 以及 fellows 中的 o 都与表达式匹配。 |
到这里,要提出两个概念了 ---- 贪婪模式 和 懒惰模式。
默认情况下,我们其实都在做 贪婪模式 的搜索,也就是尽可能多地搜索,那么 懒惰模式 呢?和 贪婪模式 相反,懒惰模式 就是要尽可能少地搜索。
要进行懒惰模式的搜索,将上面表格中的每一个表达式后面都加上 ? 符号就可以了,如 *?,+?,??,{n}?,{n,}?, {n,m}?
在懒惰模式下的搜索结果会怎么样呢?还是自己动手试试看吧。
说明:
在这里留两个作业:
- 怎样判断用户输入的座机号码或者手机号码格式正确?
- 怎样判断用户输入的 IP 地址格式正确?
到此为止,你已经可以摆平一小部分的正则表达式的应用场景了,现在回过头来看“概述”那张的两句正则表达式,你是否能看懂呢?嗯~还差一点点,那个括号是用来干什么的?好的,下一章就来看看括号的作用吧。