记录正则表达式
元字符
| 符号 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配字母,数字,或下划线 |
| \s | 匹配空白字符,包括\r,\t,\n |
| \d | 匹配数字 |
| \b | 匹配单词的开始或者结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
字符转义
如果要查找元字符本身,如 . ,是无法直接指定的,需要使用 \ 进行转义,例如 www.baidu\.com 匹配www.baidu.com。
重复
| 符号 | 说明 |
|---|---|
| * | 重复零次或多次 |
| + | 重复一次或多次 |
| ? | 重复零次或一次 |
| {n} | 重复n次 |
| {n,} | 至少重复n次 |
| {n,m} | 重复n到m次 |
字符类
匹配没有预定义元字符的字符集合的方式,如元音字母a,e,i,o,u。只需要在方括号里列出它们就可以了,像 [aeiou] 匹配任何一个元音字母, [.?!] 匹配标点符号。也可以轻松指定一个字符范围,像 [0-9] 代表的含义与 \d 完全一致, [a-z0-9A-Z] 也完全等同于 \w (如果只考虑英文的话)。
一个更复杂的表达式: \(?0\d{2}[)-]?\d{8} 。
上面这个表达式可以匹配几种格式的电话号码,(010)12345678,或者010-12345678,或者01012345678等。
分枝条件
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应当成匹配,具体方法是用 | 把不同的规则分隔开。
例子:0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码,一种是3位区号加8位本地号,另一种是4位区号加7位本地号。
\d{5}-\d{4}|\d{5}这个例子用于说明使用分枝条件时,要注意各个条件的顺序。匹配分枝条件时,将会从左至右测试每个条件,如果满足了其中一个分枝条件,就不会去管其他的条件了。
分组
重复单个字符直接在字符后面加上限定符就可以了,若想重复多个字符,则需要用小括号来指定子表达式(也叫分组)。例子:(\d{1,3}.){3}\d{1,3}
反义
| 符号 | 说明 |
|---|---|
| \W | 匹配非字母,数字,下划线字符 |
| \S | 匹配非空白字符 |
| \D | 匹配非数字字符 |
| \B | 匹配非单词开头或结尾的位置 |
| [^X] | 匹配除了X以外的字符 |
| [^aeiou] | 匹配除了aeiou这几个字母以外的字符 |
零宽断言
断言用来声明一个应该为真的事实,正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp) 也叫 零宽度正预测先行断言 ,它断言自身出现的位置后面能够匹配表达式exp。例子:
\b\w+(?=ing\b),匹配以ing结尾的单词的前部分,如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp) 也叫 零宽度正回顾后发断言 ,它断言自身出现位置的前面能匹配表达式exp。例子:
(?<=\bre)\w+\b,匹配以re开头的单词的后部分,如查找reading a book.时,它会匹配ading。
负向零宽断言
(?!exp) 零宽度负预测先行断言 ,断言此位置后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三维数字,且这三位数字后面不能是数字。
(?<!exp) 零宽度负回顾后发断言 ,断言此位置前面不能匹配表达式exp。例如: (?<![a-z])\d{7}匹配前面不是小写字母的7位数字。
注释
小括号的另一种用途是通过语法 (?#comment) 来包含注释。例如: 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
贪婪与懒惰
贪婪匹配尽可能多的字符,懒惰匹配尽可能少的字符。
以aabab为例,贪婪:a.b,匹配结果为aabab,懒惰:a.\?b,匹配结果为aab和ab(为什么第一个匹配到的是aab[1-3]字符而不是ab[2-3]字符 ??? 简单的说,因为正则表达式有另外一条规则,其优先级高于贪婪/懒惰规则:最先开始的匹配拥有最高的优先权)。
| 符号 | 说明 |
|---|---|
| *? | 重复0次或多次,但尽可能少重复 |
| +? | 重复1次或多次,但尽可能少重复 |
| ?? | 重复0次或1次,但尽可能少重复 |
| {n,m}? | 重复n到m次,但尽可能少重复 |
| {n,}? | 重复n此以上,但尽可能少重复 |