Java是一门被广泛使用的编程语言,可以在包括 Windows 在内的多种平台上使用。有一些以 Java 或为 Java 编写的包中支持正则表达式功能。但是,因为现已成为 Java 2 一部分的 java.util.regex 包极好地支持了正则表达式功能,所以下面仅就 java.util.regex 这个包来讨论 Java 中的正则表达式功能。
Java 中的正则表达式可以用来验证文本,也可以对文本进行搜索和替换。Java 支持的字符类相当广泛,包括标准的正则表达式字符类,POSIX 符类以及 Unicode 字符类。此外,java.util.regex 包也提供其他方面的丰富功能。
java.util.regex 包是在 J2SE 1.4 Java 2 Standard Edition Version 1.4 中引入的。因此,要在 Java 中使用正则表达式,至少需要 1.4 版本以上的 Java。
java.util.regex 包中有三个类 —— Pattern、Matcher 和 PatternSyntaxException。在本章节后面将分别介绍这三个类。
java.util.regex.Pattern 类表示编译后的正则表达式。Pattern 类没有公共的构造函数,要创建一个模式(pattern)对象,必须使用该类的静态方法 compile()。
正则表达式模式是以一个字符串表示的。该正则表达式通过 compile() 方法编译成一个 Pattern 类的实例。而这个 Pattern 对象可以用于创建一个 Matcher 对象,通过 Matcher 对象就能依照在 Pattern 对象中定义的正则表达式来匹配任意字符序列。
典型的 Pattern 和 Matcher 对象的用法如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo1 { public static void main(String[] args) { Pattern myPattern= Pattern.compile("正则表达式"); Matcher myMatcher = myPattern.matcher("测试字符串"); boolean myBoolean = myMatcher.matches(); System.out.println(myBoolean); } }
注意:Pattern 类的实例是不可变的,因此在多线程环境下使用是安全的。
正则表达式匹配器,可以使用 Pattern 的 matcher(CharSequence input) 方法获取。创建匹配器后,可以使用它执行三种不同的匹配操作:
matches:方法尝试将整个输入序列与该模式匹配
lookingAt:方法尝试将输入序列从头开始与该模式匹配
find:方法扫描输入序列以查找与该模式匹配的下一个子序列
上面三个方法都返回一个表示成功或失败的布尔值。
匹配器在其输入的子集(称为区域)中查找匹配项。默认情况下,此区域包含全部的匹配器输入。可通过 region 方法修改区域,通过 regionStart 和 regionEnd 方法查询区域。区域边界与某些模式构造交互的方式是可以更改的。
此类还定义使用新字符串替换匹配子序列的方法,需要时,可以从匹配结果计算出新字符串的内容。可以先后使用 appendReplacement 和 appendTail 方法将结果收集到现有的字符串缓冲区,或者使用更加便捷的 replaceAll 方法创建一个可以在其中替换输入序列中每个匹配子序列的字符串。
注意:此类的实例用于多个并发线程是不安全的。
该类是匹配操作的结果。 此接口包含用于确定与正则表达式匹配结果的查询方法。通过 MatchResult 可以查看匹配边界、组和组边界,但是不能修改。
注意:该类从 JDK 1.5 版本提供
该类从 JDK 1.4 开始可用,它用于当我们的正则表达式模式中存在语法错误时,抛出该异常类。该类继承自 RuntimeException,因此该类是未经检查的异常。
注意:未经检查及不需要使用 try catch 进行捕获,编译也不会抛出错误;
例如:执行下面错误的正则表达式
Pattern.matches("(hello( )(world)", "hello world");
抛出如下错误信息:
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 16 (hello( )(world) ^ at java.util.regex.Pattern.error(Pattern.java:1955) at java.util.regex.Pattern.accept(Pattern.java:1813) at java.util.regex.Pattern.group0(Pattern.java:2908) at java.util.regex.Pattern.sequence(Pattern.java:2051) at java.util.regex.Pattern.expr(Pattern.java:1996) at java.util.regex.Pattern.compile(Pattern.java:1696) at java.util.regex.Pattern.<init>(Pattern.java:1351) at java.util.regex.Pattern.compile(Pattern.java:1028) at java.util.regex.Pattern.matches(Pattern.java:1133)