正则表达式,又称规则表达式(Regular expression,简写为regex),是计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。众多语言中都可以支持正则表达式,如Perl、PHP、Java、Python、Ruby等。在Java中,正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。它能使我们在进行这些操作时,写代码更加简洁。
二.语法注意:不同于其他语言,在 Java 的正则表达式中需要有两个反斜杠才能被解析为其他语言中的转义作用。
以下是常用的正则表达式术语。
| 字符 | 说明 | |
|---|---|---|
| 将下一字符标记为特殊字符、文本、反向引用或八进制转义符 | ||
| ^ | 匹配输入字符串开始的位置 | |
| $ | 匹配输入字符串结尾的位置 | |
| * | 零次或多次匹配前面的字符或子表达式 | |
| + | 一次或多次匹配前面的字符或子表达式 | |
| ? | 零次或一次匹配前面的字符或子表达式 | |
| {n} | n 是非负整数。正好匹配 n 次 | |
| {n,} | n 是非负整数。至少匹配 n 次 | |
| {n,m} | M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次 | |
| x|y | 匹配 x 或 y | |
| [xyz] | 匹配包含的任一字符 | |
| [^xyz] | 匹配未包含的任何字符 | |
| [a-z] | 匹配指定范围内的任何字符 | |
| [^a-z] | 匹配不在指定的范围内的任何字符 | |
| b | 匹配一个字边界,即字与空格间的位置 | |
| B | 非字边界匹配 | |
| d | 数字字符匹配 | |
| D | 非数字字符匹配 | |
| f | 换页符匹配 | |
| n | 换行符匹配 | |
| r | 匹配一个回车符 | |
| s | 匹配任何空白字符,包括空格、制表符、换页符等 | |
| S | 匹配任何非空白字符 | |
| t | 制表符匹配 | |
| v | 垂直制表符匹配 | |
| w | 匹配任何字类字符,包括下划线 | |
| W | 与任何非单词字符匹配 |
注意:正则表达式从左到右进行运算,并遵循优先级,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的按优先级从高到低进行运算。
三.替换和拆分字符串正则表达式涉及三个类:java.lang.String、java.util.regex.Pattern、java.util.regex.macher。
其中,String类中使用正则表达式的方法包括matches、replaceAll、replaceFirst、split 等,使用这些方法可以替换和拆分字符串。
1.matches()方法:告知此字符串是否匹配给定的正则表达式。('x' 'y' 'z' 分别与四个D逐个进行比较。结果都为真,所以打印结果为true)
([^abc]表示匹配除了abc以外的任意字符,所以结果为false)
2.replaceAll(String regex, String replacement)方法:使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。(将非数字0-9的全部替换为0)
3.replaceFirst(String regex, String replacement)方法:使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。(只将第一个出现的非数字0-9的替换为0)
4.split(String regex, int limit)方法:根据给定正则表达式的匹配拆分此字符串。(注意:limit参数的值决定匹配次数。如果limit<=0,split(String regex, int limit)就等同于split(String regex),否则,模式最多匹配(limit-1)次)
(不设置limit,默认全部拆分)
(设置了limit=2,所以匹配次数为1,拆分1次)
*贪婪匹配与懒惰匹配:
默认情况下,使用贪婪匹配,即匹配尽可能多的字符。例如,对于表达式:a.*b,它将会匹配最长的以a开始、以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。如果想要匹配最少的字符,只需加个 ?,也就是说,表达式 a.*?b 匹配最短的以a开始、以b结束的字符串。



