入门
元字符
下面是常用元字符:
| 代码 | 说明 | 
|---|---|
| . | 匹配除换行符以外的任意字符 | 
| \w | 匹配字母或数字或下划线或汉字 | 
| \s | 匹配任意空白符 | 
| \d | 匹配数字 | 
| \b | 匹配单词的开始或者结束 | 
| ^ | 匹配字符串的开始 | 
| $ | 匹配字符串的结束 | 
重复
下面是正则表达式中所有的限定符(指定数量的代码):
| 代码 | 说明 | 
|---|---|
| * | 重复0次或者多次 | 
| + | 重复1次或者多次 | 
| ? | 重复0次或者1次 | 
| {n} | 重复n次 | 
| {n,} | 重复n次或者多次 | 
| {n,m} | 重复n到m次 | 
字符类
[] 可以指定一个字符范围,比如 [aeiou],表示匹配一个英文元音字母。[0-9] 代表的含义与 \d 就是完全一致的:一位数字。
一个复杂的表达式L \(?0\d{2}[) -]?\d{8}。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行分析:首先是一个转义字符 \(,它可能出现 0 次或者 1次 (?),然后是一个 0,后面跟着两个数字 (\d{2}),然后是 ( 或 - 或 空格 中的一个,它出现一次或者不出现,最后是8个数字 (\d{8})。
分支条件
前面的表达式,也可以匹配 010)12345678 这样错误的表达式。我们可以使用分支条件来解决这个问题。
分支条件指的是有几种规则,如果满足一种规则就应该当成匹配,具体是使用 | 分隔符把不同的规则分割开。
比如,0\d{2}-\d{8}|0\d{3}-\d{7} 这个表达式能匹配两种以连字符分割的电话号码:一种是3位区号,一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
分组
() 用小括号来指定子表达式(也叫分组)。
反义
常用的反义代码:
| 代码/语法 | 说明 | 
|---|---|
| \W | 匹配不是字母,数字,下划线,汉字的字符 | 
| \S | 匹配不是空白符的字符 | 
| \D | 匹配任意非数字的字符 | 
| \B | 匹配不是单词开头或者结束的位置 | 
| [^x] | 匹配除了x以外的任意字符 | 
| [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 | 
后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其他程序中进一步操作。默认情况,每个分组都自动拥有一个组号,从左到右,第一个为 1,第二个为 2……
后向引用用于重复搜索前面某个分组匹配的文本。例如 \1 代表分组1匹配的内容。
常用的分组语法:
| 分类 | 代码/语法 | 说明 | 
|---|---|---|
| 捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 | 
| (? | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp) | |
| (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
| 零宽断言 | (?=exp) | 匹配exp前面的位置 | 
| (?<=exp) | 匹配exp后面的位置 | |
| (?!exp) | 匹配后面跟的不是exp的位置 | |
| (?<!exp) | 匹配前面不是exp的位置 | |
| 注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 | 
贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在整个表达式能够得到匹配的前提下)匹配尽可能多的字符串。
以这个表达式为例 a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab,这被称为贪婪匹配。
有时候更需要 懒惰 匹配,也就是匹配 尽可能少 的字符。前面给出的限定符都可以被转化为 懒惰匹配,只要在它后面加上一个问号 ?。这样 .*? 就意味着 “匹配任意数量的重复,但是在能使整个匹配成功的前提下 使用最少的重复”。
a.*?b 匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于 aabab 的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
懒惰限定符:
| 代码/语法 | 说明 | 
|---|---|
| *? | 重复任意次,但尽可能少重复 | 
| +? | 重复1次或更多次,但尽可能少重复 | 
| ?? | 重复0次或1次,但尽可能少重复 | 
| {n,m}? | 重复n到m次,但尽可能少重复 | 
| {n,}? | 重复n次以上,但尽可能少重复 | 
