文档介绍:许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文 本,一些文本编辑器用正则表达式实现高级“搜萦替换”功能。那么Java又怎样呢?本文 写作时,一个包含了用正则表达式进行文本处理的J码的例子中,所有出现“[0-9] ”的地方我们都可以使用“\d”。 修改后的正则表达式如图七所示:
连字符 连宇符
\d{3} \- \d{2} \- \d{4}
前三个数字 中间两个数字 最后四个数字
图七:匹配所有123-12-1234格式的社会安全号码
二、Jakarta-0R0 库
有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl 5 兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正 则表达式API之一,而且它与Perl 5正则表达式完全兼容。另外,它也是优化得最好的 API 之一。
Jakarta-ORO 库以前叫做 OROMatcher, Daniel Savarese 大方地把它赠送给了 Jakarta Projec t。你可以按照本文最后参考资源的说明下载它。
我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用 Jakarta-ORO API。
▲ PatternCompiler 对象
首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。 Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹 配的Pattern对象。
Pat"ter nComp i ler comp i I e r=new Pe r 15Compi I er C);
▲ Pattern 对象
要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用
参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式“t[aeio]n” :
Pattern pattern二nulI;
■try {
palterr=compi I I e ("t [aei oln^):
1 (Ms IrmedPat+er np+ i &n 色) {
r i n+StackTr ace U ;
1
默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到 的模式只匹配“t in”、“ tan”、 “t en”和“t on”,但不匹配“Tin ”和“t aN”。要 创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:
pa-tterr=c=omp. i I 电(% [m 电 i o]n" .Per I SComp i I . CASE_I NSENS ITI VE_MASK):
创建好Pattern对象之后,你就可以通过PatternMatcher类用该Pattern对象进行模式 匹配。
▲ PatternMatcher 对象
PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个 Perl5Matcher 类并把结果赋值给 PatternMatcher 接口。Perl5Matcher 类是
PatternMatcher接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:
Pnt七旨r nIvtatQher matGher=nen Fpr 1 Shldtcher ():
使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都 是需要根据正则表达式进行匹配的字符串:
• boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要 精确匹配时使用。换句话说,正则表达式必须完整地描述输入字符串。
• booleanmatchesPrefix(String input, Pattern pattern) 当正则表达式匹配输入字 符串起始部分时使用。
• boolean contains(String input, Pattern pattern)当正则表达式要匹配输入字符 串的一部分时使用(即,它必须是一个子串)。
另外,在上面二个方法调用中,你还可以用PatternMatcherlnput对象作为参数替代 St ring对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符 串可能有多个子串匹配给定的正则表达式时,用PatternMatcherlnput对象作为参数就很