正则表达式
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、替换等操作。String类里也提供了如下几个特殊的方法。
- boolean matches(String regex):判断字符串是否匹配指定的正则表达式。 - String replaceAll(String regex,String replacement):将该字符串中所有regex的子串替换成replacement。 - String replaceFirst(String regex,String replacement):将改字符串中的一个regex的子串替换成replacement。 - String [] split(String regex);以regex作为分隔符,把该字符串分割成多个子串。
上面这些特殊的方法都依赖于Java提供的正则表达式支持,除此之外Java还提供了Pattern和Matcher两个类专门用于提供正则表达式支持。
正则表达式的匹配规则如下
特殊字符 | 说明 |
---|---|
$ | 匹配一行的结尾。要匹配$字符本身,请使用\$ |
^ | 匹配一行的开头。要匹配^字符本身,请使用\^ |
() | 标记子表达式的开始和结束位置。要匹配这些字符,请使用\(和\) |
[] | 用于确定中括号表达式的开始和结束位置。 |
{} | 用于标记前面子表达式的出现频度。 |
* | 指定前面子表达式可以出现零次或多次 |
+ | 指定前面表达式可以出现一次或多次 |
? | 指定前面子表达式可以出现零次或一次。 |
. | 匹配除换行符\n之外的任何单字符。 |
\ | 用于转义\n之外的任何单字符。 |
| | 用于指定两项之间任选一项。 |
预定义字符 | 说明 |
---|---|
. | 可以匹配任何字符 |
\d | 可以匹配0~9所有数字 digit(数字) |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 space(空格) |
\S | 匹配所有的非空白字符 |
\w | 匹配所有的单词字符,包括0~9所有数字、26个英文字符和下划线 word(单词) |
\W | 匹配所有的非单词字符 |
方括号表达式 | 说明 |
---|---|
表示枚举 | 例如[abc],表示a、b、c其中任意一个字符;[gz]表示g、z其中任意一个字符 |
表示范围 | 例如[a-f]表示a~f范围内的任意字符串 |
表示“与”运算:&& | 例如[a-z&&[def]]表示a~z和[def]的交集,表示d、e或f |
表示否^ | 例如[^abc]表示非a、b、c的任意字符 |
表示“并”运算 | 并运算与前面的枚举类似。例如[a-d[m-p]],表示[a-dm-p] |
正则表达式在模式串匹配中的只要有三种匹配方式:
-
贪婪模式:数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配位置。如果你发现表达式匹配的结果与预期的不符,很有可能是因为----你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
-
勉强模式:用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
-
占有模式:用加号后缀(+)表示,目前只有java支持占有模式,通常比较少用。
贪婪模式 | 勉强模式 | 占用模式 | 说明 |
---|---|---|---|
X? | X?? | X?+ | X表达式出现零次或一次 |
X* | X*? | X*+ | X表达式出现零次或多次 |
X+ | X+? | X++ | X表达式出现零次或一次 |
X{n} | X{n}? | X++ | X表达式出现n次 |
X{n,} | X{n,}? | X{n,}+ | X表达式至少出现n次 |
X{n,m} | X{n,m}? | X{n,m}+ | X表达式至少出现n次,最多出现m次 |