一、规则
元字符
代码/语法 | 说明 |
---|---|
\ | 转义字符,如转义加上.代表点符号本身 |
# | 注释 |
() | 标记子表达式的开始和结束位置 |
| | 分枝,从左到右的匹配左右任意一个表达式,满足其中任 |
\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 { |