一、规则
元字符
| 代码/语法 | 说明 |
|---|---|
| \ | 转义字符,如转义加上.代表点符号本身 |
| # | 注释 |
| () | 标记子表达式的开始和结束位置 |
| | | 分枝,从左到右的匹配左右任意一个表达式,满足其中任 |
| \num | num为正整数,如\1表示重复正则第1个匹配 |
| . | 匹配除换行符(\n\r)以外的任意单个字符 |
| [-] | 匹配字符范围,比如[a-z] |
| […] | 匹配[]中列举的字符 |
| \w | word,匹配字母或数字或下划线,等价于[A-Za-z0-9_] |
| \s | space,匹配空白符,等价于[\f\n\r\t\v],包括换行 |
| \d | digit,匹配数字字符,等价于[0-9] |
| [^…] | 匹配不在[]中列举的字符 |
| \W | 匹配任何非单词字符,等价于[^A-Za-z0-9_] |
| \S | 匹配可见字符,等价于[^\f\n\r\t\v] |
| \D | 匹配非数字字符,等价于[^0-9] |
| \s\S | 匹配所有 |
边界
| 代码/语法 | 说明 |
|---|---|
| ^ | 匹配行的开始位置 |
| $ | 匹配行的结束位置 |
| \b | 匹配单词的边界(开始或结束) |
| \B | 匹配不是单词边界的位置 |
| \A | 匹配字符串的开始位置 |
| \Z | 匹配字符串的结束位置 |
数量限定符
- 正则表达式中包含能接受重复的限定符时,通常是匹配尽可能多的字符,即默认贪婪模式。
- 相对贪婪模式,有时我们需要匹配尽可能少的字符,即懒惰匹配。一般在可重复限定符后加问号?,即可转为懒惰模式匹配。
| 代码/语法 | 说明 |
|---|---|
| * | 重复任意次,贪婪匹配 |
| + | 重复1次或更多次,贪婪匹配 |
| ? | 重复0次或1次,贪婪匹配 |
| {n} | 重复n次,贪婪匹配 |
| {n,} | 重复n次或更多次,贪婪匹配 |
| {n,m} | 重复n到m次,贪婪匹配 |
| *? | 重复任意次,懒惰匹配 |
| +? | 重复1次或更多次,懒惰匹配 |
| ?? | 重复0次或1次,懒惰匹配 |
| {n,m}? | 重复n到m次,懒惰匹配 |
| {n,}? | 重复n次以上,懒惰匹配 |
分组
| 代码/语法 | 说明 |
|---|---|
| (re) | 分组,匹配括号内的表达式,并获取这一匹配 |
| (?:re) | 匹配括号内的表达式,但不获取匹配结果,不存储 |
| (?=re) | 前向肯定匹配 |
| (?!re) | 前向否定匹配 |
| (?<=re) | 后向肯定匹配 |
| (?<!re) | 后向否定匹配 |
正则引擎匹配原理
- 正则引擎大体上可分为不同的两类,DFA(Deterministic finite automaton),确定型有穷自动机和NFA(Non-deterministic finite automaton)非确定型有穷自动机,DFA是根据字符串,去正则表达式匹配,不需要回溯,所以匹配快速,但不支持捕获组。因此大多数语言使用的是NFA,以正则表达式为主导,去字符串表达式中匹配。
- 对于一个字符串”abc”来讲,有3个字符和4个位置。如果子表达式匹配的是字符内容,则认为该子表达式是占有字符的。如果匹配的是位置,则子表达式是零宽度的。
- 零宽度的表达式的匹配开始和结束的位置是同一个,占有字符的表达式,由于它匹配开始和结束的位置不是同一个。对于整个表达式来说,通常是由字符串位置0开始尝试匹配,引擎会使正则向前传动。
二、Java版本
1 | public class RegexBasic { |