1. 元字符
. | 匹配除换行符以外的任意字符 |
/w | 匹配字母或数字或下划线或汉字 |
/s | 匹配任意的空白符 |
/d | 匹配数字 |
/b | 匹配单词的开始或结束,也就是单词的分界处,但是\b并不匹配单词分隔字符中的任何一个,它只匹配一个位置。 |
^ | 匹配字符串的开始位置 |
$ | 匹配字符串的结束位置 |
\ba\w*\b
匹配以字母 a 开头的单词,先是某个单词开始处\b,然后是字母a,然后是任意数量的字母或数字 \w*,最后是单词结束处 \b
\d+
匹配1个或更多连续的数字。这里的 + 是和 * 类似的元字符,不同的是*匹配重复任意次,而+则匹配重复1次或多次
\b\w{6}\b
匹配刚好6个字母/数字的单词
^\d{5,12}$
元字符^和$都匹配一个位置,^匹配你要用来查找的字符串的开头,$匹配结尾。
整个输入必须是5到12个数字
2. 字符转义 \
如果你想查找 . , 者* ,字符,这时会出现问题,因为它们会被解释成别的意思,这时你要使用 \ 来取消这些字符的特殊意义。
例如:
unibetter\.com
匹配unibetter.com
C:\\Windows
匹配C:\Windows
3. 重复 { }
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次一次 |
{n} | 重复n 次 |
{n,} | 重复n 次或多次 |
{n,m} | 重复n 到 m次 |
Windows\d+
匹配 Windows后面跟 1 个或更多个数字
^\w+
匹配一行的第一个单词
4. 字符类 [ ]
[aeiou]
就匹配任何一个英文元音字母
[.?!]
匹配标点符号(.或?或!)
[0-9]
代表的含意与\d就是完全一致的,即一位数字
[a-z0-9A-Z_]
也完全等同于\w(如果只考虑英文的话)
\(?0\d{2}[) -]?\d{8}。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或 022-22334455,或02912345678等。
分析:首先是一个转义字符 \( ,它能出现0次或1次(?), 然后是一个0,后面跟着2个数字(\d{2}),
然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字 \d{8}。
5. 分支条件 |
不幸的是,刚才那个表达式也能匹配 010)12345678 或 (022-87654321 这样的 “不正确”的格式。
要解决这个问题,我们需要用到分支条件。具体方法是用 | 把不同的规则分隔开。
0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。
\d{5}-\d{4}|\d{5}
这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。
使用分支条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
原因是匹配分支条件时,将会从左到右地测试每个条件,如果满足了某个分支的话,就不会去再管其它的条件了。
6. 分组 ( )
(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式。
分析:\d{1,3} 匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,
最后再加上一个一到三位的数字( \d{1,3} )。
不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。
描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
理解这个表达式的关键是理解2[0-4]\d|25[0-5]|[01]?\d\d?
7. 反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,
其它任意字符都行的情况,这时需要用到反义:
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x 以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
\S+
匹配不包含空白符的字符串。
<a[^>]+>
匹配用尖括号括起来的以a开头的字符串。
8. 贪婪与懒惰 ?
*? | 重复任意次,尽可能少重复 |
+? | 重复1次或更多次,尽可能少重复 |
?? | 重复0次或1次,尽可能少重复 |
{n,m}? | 重复n到m次,尽可能少重复 |
{n,}? | 重复n次以上,尽可能少重复 |
a.*b
它将会匹配最长的以 a开始,以b结束的字符串,用它来搜索aabab的话,它会匹配整个字符串aabab。
懒惰匹配:有时,我们更需要匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b
匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。