一、Java正则表达式
在其他语言中,
\\
表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠在 Java 中,
\\
表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。如果想让修饰符只是一个字符,没有修饰,则需要这样:
\\*
表示一个普通的星号,*
则表示匹配0次或多次格式: <特殊符号或字符><修饰符>
1、修饰符
修饰符 能修改匹配前面 特殊符号或字符 的次数
字符 | 说明 |
---|---|
* | 零次或多次匹配前面的字符或子表达式。最少匹配0次 |
+ | 一次或多次匹配前面的字符或子表达式。最少匹配1次 |
? | 零次或一次匹配前面的字符或子表达式。只能匹配1次或0次 |
{n} | 正好匹配 n 次。规则:n <=0 |
{n,} | 至少匹配 n 次。规则:n<=0 |
{n,m} | 匹配至少 n 次,至多 m 次。规则:n<=0,m<=0, n <= m。 |
2、分组
正常情况下,修饰符只能匹配前一个字符或正则特殊符号,不能匹配多个字符,这时候分组就有必要了。
74{3}匹配结果7444
(74){3}匹配结果747474
这就是区别,分组用括号表示
3、正则特殊符号
这里的正则符号用单反斜杠表示,java实际使用需要双反斜杠
2.1、常见符号
符号 | 作用 |
---|---|
\ | 正则基本标识符,将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 |
A | 匹配一个字符A |
\d | 匹配一个数字(0~9) |
\D | 匹配一个非数字 |
\w | 匹配一个字符(a~z A~Z 0~9) |
\W | 匹配一个非单词、非数字的字符(空格,逗号) |
\s | 匹配一个空白符(空格、tab、换行、换页、回车) |
\S | 匹配一个非空白符(可以用匹配空白符取反表示非空白符) |
. | 匹配除"\r \n"之外的任何单个字符,注意不需要使用反斜杠,直接使用点就行 |
\t | 匹配一个制表符Tab |
\n | 匹配一个换行符 |
\r | 匹配一个回车 |
\f | 匹配一个换页 |
\e | 匹配一个转义(Escape) |
\xhh | 匹配一个 十六进制 值为0xhh的字符 |
\uhhhh | 匹配一个 十六进制 表现为0xhhhh的Unicode字符 |
2.2、逻辑符号
逻辑符号一般建议分组,也就是使用括号,防止混淆
符号 | 作用 |
---|---|
&& | 与,相交部分 |
| | 或 |
^ | 非 |
2.3、多选一格式
使用方括号 括起来的内容能匹配符合内容的任意一个
格式:[ 表达式 ] ,总是先计算表达式,然后匹配
表达式 | 含义 |
---|---|
[abc] | 包含a、b或c的任何字符 |
[^abc] | 除a、b和c之外的任何字符(否定) |
[a-zA-Z] | 从a到z或从A到Z的任何字符(范围) |
[abc[hij]] | a、b、c、h、i、j中的任意字符 |
[a-z&&[hij]] | 任意h、i或j(交) |
2.4、边界匹配符
顾名思义,以下的匹配符能匹配字段、行的开始和结束
边界匹配符 | 含义 |
---|---|
^ | 一行的开始 |
$ | 一行的结束 |
\b | 词的边界 |
\B | 非词的边界 |
\G | 前一个匹配的结束 |
4、匹配模式——量词
贪婪型: 贪婪表达式会为所有可能的模式发现尽可能多的匹配。
懒惰型: 用问号来指定,这个量词匹配满足模式所需的最少字符数。
占有型: 目前,这种类型的量词只有在 Java 语言中才可用(在其他语言中不可用),并且也更高级,因此我们大概不会立刻用到它。当正则表达式被应用于 String 时,它会产生相当多的状态,以便在匹配失败时可以回溯。而“占有的”量词并不保存这些中间状态,因此它们可以防止回溯。它们常常用于防止正则表达式失控,因此可以使正则表达式执行起来更高效。
下面表中X是表达式,建议用圆括号括起来
贪婪型 | 懒惰型 | 占有型 | 如何匹配 |
---|---|---|---|
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 次 |
5、易混淆点
5.1、括号的区别
()表示分组,例如
(ab)*
可以匹配ababab[]表示多选一,例如
[ab]
可以匹配到a或者b{}表示匹配次数区间,这是个修饰符,例如a{1,3}可以匹配a、aa、aaa
5.2、^的两种不同状态
在多选一[]中是逻辑非,例如
[^a-z]
可以匹配到 非a-z 的字母一次,匹配多次需要修饰符除此之外表示开头,例如
^a
可以匹配a开头的
6、案例备用
^a.*
以a开头的任意字符(除特殊符号 回车和换行)
^[\\w\\s]
以匹配任意开头