正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
其实就是一种规则。
常见组成规则
1. 字符
元字符 |
说明 |
x |
字符 x |
\xhh |
十六进制表示为oxhh的字符 |
\uhhhh |
十六进制表示为oxhhhh的Unicode字符 |
\\\\ |
反斜线字符 |
\n |
换行符 (‘\u000A’) |
\r |
回车符 (‘\u000D’) |
\f |
换页符 |
\e |
转义符(Escape) |
2. 字符类
元字符 |
说明 |
[abc] |
包含a、b、c的任何字符(和a|b|c作用相同) |
[^abc] |
除了a、b和c之外的任何字符(否定) |
[a-zA-Z] |
从a到z或从A到Z的任何字符(范围) |
[abc[hij]] |
任意a、b、c、h、i和j字符(与a|b|c|h|i|j作用相同)(合并) |
[a-z&&[hij]] |
任意h、i或j(交) |
[0-9] |
0到9的字符都包括 |
\s |
空白符(空白、tab、换行、换页和回车) |
\S |
非空白符([^\s]) |
\d |
数字[0-9] |
\D |
非数字[^0-9] |
\w(小写) |
单词字符。等价于[a-zA-Z_0-9] |
\W(大写) |
表示非单词字符 |
. |
匹配除换行符(\n、\r)之外的任何单个字符 |
3.逻辑操作符
元字符 |
说明 |
XY |
Y跟在X后面 |
X|Y |
X或Y |
(X) |
捕获组(capturing group)。可以再表达式中用\i引用第i个捕获组 |
4. 边界匹配器
元字符 |
说明 |
^ |
行的开头 |
$ |
行的结尾 |
\b |
匹配一个单词边界,即字与空格间的位置 |
\B |
非单词边界匹配 |
\G |
前一个匹配的结束 |
5. 量词(限定词)
量词描述了一个模式吸收输入文本的方式:
- 贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配
- 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数。
- 占有型:这种类型的量词只有在Java中才可用,并且也更高级。当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯。而“占用的”量词并不保存这些中间状态,因此它们可以防止回溯。它们常常用于防止正则表达式失控,因此可以使正则表达式执行起来更有效。
| 贪婪型 | 勉强型 | 占有型 | 如何匹配 |
| —- | —- | —- | —- |
| X? | X?? | X?+ | 一个或零个X |
| X | X? | X*+ | 零个或多个X |
| X+ | X+? | X++ | 一个或多个X |
| X{n} | X{n}? | X{n}+ | 恰好n次X |
| X{n,} | X{n,}? | X{n,}+ | 至少n次X |
| X{n,m} | X{n,m}? | X{n,m}+ | X至少n次,且不超过m次 |
注:表达式X通常必须要用圆括号括起来,以便它能够按照我们期望的效果去执行
贪婪匹配与懒惰匹配
- 贪婪匹配: a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。
- 懒惰匹配: 匹配尽可能少的字符。
.*?
就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。 a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。
常见语法
元字符 |
说明 |
+ |
表示一个或多个之前的表达式 |
-?\\d+ |
可能有一个负号,后面跟着一位或者多位数字 |
(-|\\+)? |
可能以一个加号或者负号开头 |