正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们可以以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理。
1.创建正则表达式
正则表达式就是以某种方式描述字符串。比如说一个单词是以a开始和b结尾,那这样的一个描述(也成为模式)该如何表示呢?
a.常用字符
x 字符x
\\ 正斜杠
\xhh 十六进制值为0xhh的字符
\uhhhh 十六进制表示0xhhhh的Unicode字符
\t 制表符Tab
\n 换行符
\r 回车
\f 换页
\a The alert (bell) character ('\u0007')
\e 转义
b.常用字符类
[abc] a,b,c中的任何一个字符
[^abc] 除了a,b,c的任何字符
[a-zA-Z] 从a-z或从A到Z的任意字符
[a-d[m-p]] a到d或m到p的任意字符
[a-z&&[def]] 任意d,e,f
. 任意字符
\d 数字[0-9]
\D 非数字 [^0-9]
\s 空白符[ \t\n\x0B\f\r]
\S 非空白符[^\s]
\w 词字符[a-zA-Z_0-9]
\W 非词字符[^\w]
c,边界字符
^ 一行的起始
$ 一行的结束
\b 词的边界
\B 非词的边界
\A 输入的起始
\G 前一个匹配的结束
d,逻辑操作符
XY Y跟在X后面
X|Y X或Y
(X) X, 作为一个捕获组
e,量词
量词描述了一个模式吸收输入文本的方式:
1)贪婪型:量词总司贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型里有就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。比如说一个模式为匹配以1开始的字符串,那么对于123456这样的字符串,会匹配123456全部。
2)勉强型:用问号来到指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的、最少匹配的。非贪婪的、或不贪婪的。比如上面的例子它将只匹配1而已
3)占占有型:目前,这种类型的两次只有在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次 |
这些就是常用的进行创建正则表达式的字符,由于在Java中\表示转义字符,所以要表示\时需要使用\\。
2.Java中的正则表达式工具
Java中用来使用正则表达式的工具位于java.util.regex包中。主要就是Pattern和Matcher两个对象。Pattern用于构建模式,Matcher用来匹配模式。
典型的调用如下:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
一些详细的操作可参见http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4