正则表达式
正则表达式(regularexpression)用于指定字符串的模式,可以在任何需要定位匹配某种特定模式的字符串的情况下使用正则表达式。从1.4开始,java增加了包java.util.regex来处理正则表达式。
基础语法
字符
构造 | 匹配 |
字符 x | |
\\ | 反斜线字符 |
\0n | 带有八进制值 0 的字符 n (0 <= n <= 7) |
\0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
\0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
\xhh | 带有十六进制值 0x 的字符 hh |
\uhhhh | 带有十六进制值 0x 的字符 hhhh |
\t | 制表符 ('\u0009') |
\n | 新行(换行)符 ('\u000A') |
\r | 回车符 ('\u000D') |
\f | 换页符 ('\u000C') |
\a | 报警 (bell) 符 ('\u0007') |
\e | 转义符 ('\u001B') |
\cx | 对应于 x 的控制符 |
字符类
构造 | 匹配 |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
这里的“[]”里的内容可以理解为是一个集合。其中“&&”表示且的关系,这里没有集合间显性的并关系,但有非的操作符“^”。需要注意。
字符类操作符优先级
字面值转义 | \x | |
2 | 分组 | [...] |
3 | 范围 | a-z |
4 | 并集 | [a-e][i-u] |
5 | 交集 | [a-z&&[aeiou]] |
预定义字符类
构造 | 匹配 |
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
边界匹配器
构造 | 匹配 |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
边界匹配器中的“^”和集合中的“^”含义是不一样的,多注意。另外要注意行开头结尾和输入开头结尾的区别,使用时要根据不同需要来。
数量
构造 | 匹配 |
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
逻辑运算符
构造 | 匹配 |
XY | X 后跟 Y |
X|Y | X 或 Y |
(X) | X,作为捕获组 |
逻辑预算符是正则表达式间的运算,和集合间的关系符存在不同。“()”是分组的好办法,使用方法类似于四则运算。
转义
反斜线字符 ('\') 用于引用转义构造,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式\\ 与单个反斜线匹配,而 \{ 与左括号匹配。
在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。
以上是正则表达式中一些常用的基础的语法知识,还有一些更多的知识没有在这里。个人觉得这些东西就可以满足大多数的使用需求。
Pattern和Matcher
对于java中使用正则表达式,是通过Pattern和Matcher来完成的,常用的方法如下:
Pattern p =Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
以上就是正则表达式最简单的用法—判别某个特定的字符串是否与它匹配。但是还有另外一种用法就是拆分字符串,该方法类似于String类中的split方法,只是通过满足正则表达式的字符串来作为拆分的条件的。如:
Pattern p =Pattern.compile("a*b");
p.split("aaaaab");
通过匹配器Matcher我们可以进一步提升正则表达作用。可以对字符串进行查找、替换等操作。详细的内容可以参见API。