Java正则表达式应用总结(一)

2014-11-24 01:45:34 · 作者: · 浏览: 3

Java正则表达式应用总结

2009-07-17 08:45:17

标签:正则表达式

版权声明:原创作品,谢绝转载!否则将追究法律责任。

Java正则表达式应用总结

一、概述

正则表达式是Java处理字符串、文本的重要工具。

Java对正则表达式的处理集中在以下两个两个类:

java.util.regex.Matcher 模式类:用来表示一个编译过的正则表达式。

java.util.regex.Pattern 匹配类:用模式匹配一个字符串所表达的抽象结果。

(很遗憾,Java Doc并没有给出这两个类的职责概念。)

比如一个简单例子:

Java代码

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 正则表达式例子

*

* @author leizhimin 2009-7-17 9:02:53

*/

public class TestRegx {

public static void main(String[] args) {

Pattern p = Pattern.compile("f(.+ )k");

Matcher m = p.matcher("fckfkkfkf");

while (m.find()) {

String s0 = m.group();

String s1 = m.group(1);

System.out.println(s0 + "||" + s1);

}

System.out.println("---------");

m.reset("fucking!");

while (m.find()) {

System.out.println(m.group());

}

Pattern p1 = Pattern.compile("f(.+ )i(.+ )h");

Matcher m1 = p1.matcher("finishabigfishfrish");

while (m1.find()) {

String s0 = m1.group();

String s1 = m1.group(1);

String s2 = m1.group(2);

System.out.println(s0 + "||" + s1 + "||" + s2);

}

System.out.println("---------");

Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])");

Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31");

while (m3.find()) {

System.out.println(m3.group());

}

}

}

输出结果:

fck||c

fkk||k

---------

fuck

finish||in||s

fishfrish||ishfr||s

---------

1900-01-01

2007/08/13

1900.01.01

1900 01 01

1900 02 31

Process finished with exit code 0

二、一些容易迷糊的问题

1、Java对反斜线处理的问题

在其他语言中,\\表示要插入一个字符\;

在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。

看API文档:

预定义字符类

. 任何字符(与行结束符可能匹配也可能不匹配)

\d 数字:[0-9]

\D 非数字:[^0-9]

\s 空白字符:[ \t\n\x0B\f\r]

\S 非空白字符:[^\s]

\w 单词字符:[a-zA-Z_0-9]

\W 非单词字符:[^\w]

但是看看上面程序,对比下不难看出:

\d在实际使用的时候就写成了\\d;

在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\\\,原因是下面的APIDoc定义\\表示一个反斜线。

但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r.

字符

x 字符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 的控制符

2、Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。

3、Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用

Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。

或者Matcher.reset(CharSequence input) 重置此具有新输入序列的匹配器。

来重复使用匹配器。

4、组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。

例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;