在Java中使用正则表达式

前言

之前的一篇文章已经简单介绍过正则表达式了,这里将使正则表达式派上用场——介绍如何在Java中使用正则表达式。因此对刚接触正则表达式的童鞋请参考有关资料,在此因篇幅有限不作介绍。

在 JDK1.3 或之前的 JDK 版本中并没有包含正则表达式库可供 JAVA 程序员使用,之前我们一般都在使用第三方提供的正则表达式库,这些第三方库中有源代码开放的,也有需付费购买的,而在 JDK1.4 的测试版中也已经包含有正则表达式库—java.util.regex

java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。

即JDK1.4之后都能使用java.util.regex包匹配正则表达式。

Pattern 和 Matcher

java.util.regex包下有两个关键类——“Pattern”,“Matcher”。功能如下:

类名 介绍
Pattern 一个 Pattern 是一个正则表达式经编译后的表现模式。
Matcher 一个 Matcher 对象是一个状态机器,它依据 Pattern 对象做为匹配模式对字符串展开匹配检查。

首先一个 Pattern 实例订制了一个所用语法与 PERL 的类似的正则表达式经编译后的模式,然后一个 Matcher 实例在这个给定的 Pattern 实例的模式控制下进行字符串的匹配工作。

以下就分别来看看这两个类:

Pattern详解

Pattern方法类型 Pattern方法介绍
static Pattern compile(String regex):将给定的正则表达式编译并赋予给 Pattern 类
static Pattern compile(String regex,int flags):同上,但增加flag参数,可选参数包括CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE,CANON EQ
int flags():返回当前Pattern匹配的flag参数
Matcher matcher(CharSequence input):生成一个给定命名的 Matcher 对象
static boolean matches(String regex, CharSequence input):编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适 于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个 Matcher 实例。
String pattern():返回该 Patter 对象所编译的正则表达式。
String[] split(CharSequence input):将目标字符串按照 Pattern 里所包含的正则表达式为模进行分割。
String[] split(CharSequence input,int limit):作用同上,limit指定分割的段数

一个正则表达式,也就是一串有特定意义的字符,必须首先要编译成为一个 Pattern 类的实例,这个 Pattern 对象将会使用 matcher()方法来生成一个 Matcher 实例,接着便可以使用该 Matcher 实例以编译的正 则表达式为基础对目标字符串进行匹配工作,多个 Matcher 是可以共用一个 Pattern 对象的。

Matcher详解

Matcher方法类型 Matcher方法介绍
Matcher appendReplacement(StringBuffer sb, String replacement):将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里。
StringBuffer appendTail(StringBuffer sb):将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。
int end():返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置 。
int end(int group):返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。
boolean find():尝试在目标字符串里查找下一个匹配子串。
boolean find(int start):重设 Matcher 对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。
String group():返回当前查找而获得的与组匹配的所有子串内容。
String group(int group):返回当前查找而获得的与指定的组匹配的子串内容。
int groupCount():返回当前查找所获得的匹配组的数量。
boolean lookingAt():检测目标字符串是否以匹配的子串起始。
boolean matches():尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。
Pattern pattern():返回该 Matcher 对象的现有匹配模式,也就是对应的 Pattern 对象。
String replaceAll(String replacement):将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。
String replaceFirst(String replacement):将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。
Matcher reset():重设该 Matcher 对象。
Matcher reset(CharSequence input):重设该 Matcher 对象并且指定一个新的目标字符串。
int start():返回当前查找所获子串的开始字符在原目标字符串中的位置。
int start(int group):返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。

一个 Matcher 实例是被用来对目标字符串进行基于既有模式(也就是一个给定的 Pattern 所编译的正则表达式)进行匹配查找的,所有往 Matcher 的输入都是通过 CharSequence 接口提供的,这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。

匹配实例

前面说了这么多废话,其实真正的运用却非常简单。下面,我们来匹配所有 Month DD,YYYY 格式的日期,其中定义月份值为第一个组。

正则表达式分析如下:

Month DD,YYYY

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.airing.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternDemo010 {
public static void main(String args[]){
String str1 = "june 30, 1995";
/*
* ():表示分组
* {a-z}:表示出现的内容范围
* +:表示出现1次或多次
* \\s:表示空格
* */
Pattern p = Pattern.compile("([a-z]+)\\s+[0-9]{1,2},\\s*[0-9]{4}");
//将匹配程序交由Matcher进行匹配
Matcher m = p.matcher(str1);
//调用Matcher类中的matches()方法,测试是否可以匹配
if(m.matches()){
System.out.println("匹配成功") ;
}else{
System.out.println("不能匹配") ;
}
}
}

没错,很简单吧~其实就三句话即可实现匹配和判断。至于Pattern和Matcher的其他方法,有兴趣的童鞋可以自行研究。掌握至此,便也就足够了。