前言

  最近放寒假了,时间比较多,终于有时间继续研究Java的基础知识。这几天在看《Java编程思想》这本书,刚好看完了正则表达式这一张章节,写一遍博客记录以下,防止忘记(虽然还是会忘记)


介绍

什么是正则表达式?

  正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。正则表达式使用单个字符串描述、匹配一系列符合某个句法规则的字符串(CV大法)。

  说白了,正则表达式就是定义字符串的规则。我们使用正则表达式,为字符串定义一个规则,比如我们定义一个正则表达式,表示一个只由数字组成,长度任意的字符串,然后,我们就可以用这个正则表达式去匹配任意字符串,看这个字符串是否匹配这个规则。


在Java中如何使用正则表达式?

  正则表达式的语法我这里就不提了,太多太杂,不会的可以去菜鸟教程看看,我这里主要就是写写在Java中如何使用正则表达式。

  在Java中使用正则表达式,首先得知道两个类,一个叫做Pattern,一个叫做Matcher,这两个类都是java.util.regex包下的,这个包下也就这两个类。

Pattern类

  Pattern类是用来干嘛的呢,其实我们可以把他简单理解为就是一个正则表达式(就像File类一样,我们可以简单理解为它就是一个文件)。Pattern类没有公共的构造方法,这意味着我们不能直接new一个Pattern类的对象。在这个类中,提供了一个方法,名字叫compile,我们将正则表达式作为参数,传入这个方法中,就可以得到一个Pattern对象,我们可以将这个对象理解为就是传入的正则表达式。

  Pattern类有一个实例方法,叫做matcher,这个方法接收一个参数,就是需要匹配的字符串,方法的返回值就是一个Mather对象。

Matcher类

  Matcher类又是用来干嘛的呢?Matcher这个单词翻译过来就是匹配器的意思,一个Matcher对象就是一个匹配器,我们通过这个匹配器,就可以操作正则表达式与字符串的匹配过程。操作的是哪个正则表达式和字符串呢?就是我们调用Pettern类的compile方法生成的Pettern对象,以及调用Pettern对象的matcher方法传入的要匹配的字符串。通过这个匹配器对象,我们可以控制字符串的匹配,查看匹配结果,甚至可以替换等便利的操作。


代码

正则表达式小demo

  下面我们看一个简单的小demo:使用正则表达式,匹配字符串中所有数字部分,输出匹配的部分,以及匹配的部分在原字符串中的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) throws FileNotFoundException {

// 使用Pattern类的compile方法,传入一个正则表达式,得到一个Pattern对象
Pattern pattern = Pattern.compile("[0-9]+");
// 调用pattern对象的matcher方法,传入需要匹配的字符串, 得到一个匹配器对象
Matcher matcher = pattern.matcher("abcd123acca123a1a2");

// 从字符串开头,逐一向后匹配,直到无法再匹配为止
while(matcher.find()) {
// 输出上一次匹配的内容
System.out.print(matcher.group() + ": ");
// 输出上一次匹配的首尾索引
System.out.println(matcher.start() + "->" + (matcher.end()-1) );
}
}

  上面的代码首先使用Pattern类的compile方法,传入一个正则表达式,得到一个Pattern对象,[0-9]+这个表达式的意思就是任意长度,且仅由0-9组成的字符串。得到Pattern对象后,调用它的matcher方法,传入需要匹配的字符串,即可得到一个匹配器,也就是Matcher对象。

  得到这个Matcher对象后,就可以进行匹配操作了。在上面的代码中,调用了find方法进行匹配。find方法的作用就是尝试从字符串中找到下一个匹配正则表达式的部分,若匹配成功,就返回true,否则返回false,而已经匹配的部分会被跳过。Matcher对象的group()方法返回上一次匹配的部分,而start()方法返回上一次匹配部分的开始索引,end()方法返回上一次匹配部分的结束索引+1的值。我们在while循环的条件中调用find方法进行匹配,若匹配成功,则输出上次匹配的部分,以及匹配部分在原字符串中的位置。例如上面的代码,输出结果如下:

1
2
3
4
123:  4->6
123: 11->13
1: 15->15
2: 17->17

总结

  上面描述了PatternMatcher类最基本的操作,但是这两个类的作用远不止如此,它们还可以进行很多方便的操作,比如替换操作等,但是这里就不一一描述了,有时间再慢慢补充。


参考

《Java编程思想》