Java中的正则表达式API
让我们来学习一下 Java 的正则表达式 API。
正则表达式 API
java.util.regex 包含用于在 Java 中处理正则表达式的 API。这是 Java 中最常用的正则表达式处理库,也常被称为 Java Regex,是一种强大的模式匹配工具。
您可以在程序中使用以下导入语句来使用正则表达式 API:
1import java.util.regex.*;
该包包含以下有助于在 Java 中使用正则表达式的有用类和接口:
-
Pattern类:定义用于搜索或操作字符串的模式。它还可以定义字符串的约束条件,例如电话号码、邮政编码、密码和电子邮件验证。该模式会被编译为一个 Pattern 对象,然后可用于创建 Matcher 对象,以实现不同修饰符下的字符串匹配检查。 -
Matcher类:该类对字符序列执行匹配操作。 -
MatchResult接口:提供查询方法,用于获取正则表达式匹配操作的结果。 -
PatternSyntaxException类:当提供无效或语法错误的正则表达式时抛出的未检查异常。
正则表达式的组成部分
正则表达式由两部分组成:
- 一个 模式 字符串
- 一个指定如何匹配该模式的标志(可选)
标志

标志向正则表达式处理器提供指令,说明如何查找模式。
例如,如果在模式中提供了 CASE_INSENSITIVE 标志,则会进行不区分大小写的匹配。
以下是所有可用的标志:
| 标志 | 描述 |
|---|---|
CASE_INSENSITIVE | 用于不区分大小写的匹配。搜索时忽略字母的大小写。 |
COMMENTS | 允许在模式中使用空白字符和注释。 |
DOTALL | 启用 Dotall 模式,使 . 能匹配包括换行在内的所有字符。 |
MULTILINE | 启用多行模式,使 ^ 和 $ 分别匹配每行的开始和结束。 |
UNICODE_CASE | 支持 Unicode 的大小写折叠。 |
UNIX_LINES | 启用 Unix 行模式,仅将 \n 视为行终止符。 |
CANON_EQ | 启用规范等价性匹配。 |
LITERAL | 对模式进行字面解析。模式中的特殊字符将不再具有特殊含义,而是作为普通字符处理。 |
UNICODE_CHARACTER_CLASS | 启用 Unicode 版本的预定义字符类和 POSIX 字符类。与 CASE_INSENSITIVE 标志一起使用时,还可忽略非英语字母的大小写。 |
现在让我们详细学习 Java 中的正则表达式类。
Pattern 类
Pattern 类的对象是正则表达式的编译表示形式。
每个对象代表一个模板或特定的字符序列,我们将在字符串或多个字符串中查找该序列。该模式在某些位置包含占位符(例如用于变量),因为我们不会提供全部细节。这些变量称为 模式变量。如果模式匹配成功,模式变量将被初始化为输入字符串中与模式匹配的内容。
创建 Pattern 对象
要创建一个模式,使用以下代码片段:
1static Pattern compile(<reg-exp>);
其中 <reg-exp> 是正则表达式模式。该方法会编译给定的正则表达式并返回一个 Pattern 实例。
接下来,调用 compile() 方法,并将正则表达式作为第一个参数传入。
它将返回一个 Pattern 对象。
1import java.util.regex.Pattern; 2import java.util.Arrays; 3 4public class Main { 5 public static void main(String[] args) { 6 String ipAddress = "10.52.255.1"; 7 8 // 简单的字符串匹配 9 String separator = "\\."; 10 Pattern pattern = Pattern.compile(separator); 11 12 System.out.println(Arrays.toString( 13 pattern.split(ipAddress))); 14 } 15}
Matcher 类
Matcher 类代表一个解释模式并针对输入字符串执行模式匹配操作的引擎。它实现了 MatchResult 接口。
创建 Matcher 对象
要创建一个 Matcher 对象,调用 Pattern 对象的 matcher() 方法。该方法返回一个 Matcher 对象,用于将给定输入与模式进行匹配。
1String text = "text to match"; 2 3// 创建一个匹配文本与模式的 matcher 4Matcher matcher = pattern.matcher(text);
我们将在课程后续部分学习 Matcher 类的替换方法。
MatchResult 接口
MatchResult 接口包含两类方法:索引方法 和 分析方法。索引方法用于查询匹配结果的位置信息;分析方法用于分析输入字符串,并返回匹配是否成功。
索引方法
索引方法提供匹配在输入字符串中的位置索引值。
-
public int start():返回上次匹配的起始索引。 -
public int start(int groupNumber):返回上次匹配操作中指定组捕获的子序列的起始索引。 -
public int end():返回最后一个匹配字符之后的偏移量。 -
public int end(int groupNumber):返回上次匹配操作中指定组捕获的子序列最后一个字符之后的偏移量。
分析方法
分析方法检查输入字符串,并返回一个布尔值,表示是否找到匹配。
-
boolean lookingAt():尝试从区域开头开始,将输入序列与模式进行匹配。 -
boolean find():尝试查找输入序列中下一个与模式匹配的子序列。 -
boolean find(int start):重置此匹配器,然后从指定索引开始尝试查找下一个与模式匹配的子序列。 -
boolean matches():尝试将整个字符串与模式进行匹配,并返回匹配结果的布尔值。 -
String group():返回匹配到的序列。
正则表达式匹配示例
下面的程序演示了最简单的模式匹配形式。
1import java.util.regex.Matcher; 2import java.util.regex.Pattern; 3import java.util.regex.PatternSyntaxException; 4 5public class Main { 6 public static void main(String[] args) { 7 8 final int flag = Pattern.CASE_INSENSITIVE; 9 10 // final int flag = Pattern.UNIX_LINES; // Unix lines mode 11 // final int flag = Pattern.LITERAL; 12 // final int flag = Pattern.COMMENTS; // Permits whitespace and comments 13 // final int flag = Pattern.DOTALL; // dotall - '.' matches all characters 14 // final int flag = Pattern.MULTILINE; 15 // final int flag = Pattern.CANON_EQ; // canonical equivalence 16 // final int flag = Pattern.UNICODE_CHARACTER_CLASS; // POSIX character 17 // final int flag = Pattern.UNICODE_CASE; // Unicode-aware case folding 18 19 // 创建带有不区分大小写标志的模式 20 Pattern pattern = Pattern.compile("regex", flag); 21 22 // 创建一个匹配器,将模式与给定字符串进行匹配 23 Matcher matcher = pattern.matcher("Welcome to this course!!." + 24 "\n In this course we will learn about Java regex"); 25 26 // 根据是否找到匹配返回 true 或 false 27 boolean matchFound = matcher.find(); 28 29 if(matchFound) { 30 System.out.println("匹配成功"); 31 } else { 32 System.out.println("未找到匹配"); 33 } 34 35 } 36}
尝试更换不同的标志,观察它们对匹配结果的影响。
说明
在上述示例中,正在文本中搜索单词 "regex"。
首先,我们使用 Pattern.compile() 方法创建模式对象。该方法接收两个参数:
- 模式:表示要搜索的字符串
- 标志:指示搜索应为不区分大小写(可选)
matcher() 方法在文本中搜索该模式,返回一个包含搜索信息的 Matcher 对象。
find() 方法如果在字符串中找到模式,则返回 true;否则返回 false。
PatternSyntaxException 类
PatternSyntaxException 是一个未检查异常,表示正则表达式模式语言中存在语法错误。
其主要方法如下:
getDescription():获取错误描述getIndex():获取错误位置索引getPattern():获取错误的正则表达式模式getMessage():返回包含语法错误描述、错误索引、错误模式以及模式中错误位置视觉标记的多行字符串
1import java.util.regex.*; 2 3public class Main { 4 public static void main(String[] args) { 5 // 要搜索的字符串 6 String text = "Regular Expression"; 7 8 // 无效的正则表达式 9 String searchText = "*"; 10 11 // 编译由 searchText 表示的正则表达式 12 // 并返回一个 Pattern 对象实例。 13 try { 14 Pattern pattern = Pattern.compile(searchText); 15 } catch (PatternSyntaxException e) { 16 System.out.println(">> 进入异常处理块"); 17 System.out.println(); 18 System.out.println("错误描述 -> " + e.getDescription()); 19 System.out.println("错误位置 -> " + e.getIndex()); 20 System.out.println("错误模式 -> " + e.getPattern()); 21 System.out.println(); 22 System.out.println("错误信息 -> " + e.getMessage()); 23 } 24 25 } 26}