目录
[1. 元字符](#1. 元字符)
[2. 字符集与范围](#2. 字符集与范围)
[3. 常用预定义字符集](#3. 常用预定义字符集)
[4. 分组与反向引用](#4. 分组与反向引用)
[三、Java 中正则表达式的实现](#三、Java 中正则表达式的实现)
[1. Java 基础示例](#1. Java 基础示例)
[2. 替换字符串](#2. 替换字符串)
[3. 验证输入格式](#3. 验证输入格式)
[4. 提取信息](#4. 提取信息)
[5. 拆分字符串](#5. 拆分字符串)
[1. 手机号验证](#1. 手机号验证)
[2. 提取 HTML 标签内容](#2. 提取 HTML 标签内容)
[3. 替换多余空格](#3. 替换多余空格)
摘要
正则表达式(Regular Expression,简称 Regex)是一种文本处理的利器,它广泛应用于验证、搜索、提取和替换文本的场景中。在 Java 中,正则表达式被 java.util.regex
包很好地支持,提供了强大的匹配能力。
本文将带你从零学习正则表达式,涵盖基本语法、实际应用场景以及详细的 Java 代码示例,帮助你掌握这项极为实用的技能。
一、正则表达式是什么?
正则表达式是一种用于描述文本模式的语言。通过正则表达式,你可以对文本执行以下操作:
- 验证:检查字符串是否符合特定规则(如邮箱格式、手机号验证)。
- 提取:从复杂的文本中提取有用信息(如时间、日期、IP 地址)。
- 替换:替换特定模式的字符(如清理多余空格或替换敏感信息)。
- 分割:将一个字符串按照模式拆分成多个部分。
二、正则表达式的基本语法
正则表达式由普通字符和元字符组成:
- 普通字符:字母、数字、未被特殊定义的符号(如
abc
,123
)。 - 元字符:具有特殊含义的字符(如
.
,*
,[ ]
,^
,$
等)。
1. 元字符
以下是常用的元字符及其含义:
元字符 | 描述 | 示例 |
---|---|---|
. |
匹配任意单个字符(除换行符外) | 正则 a.c 匹配 "abc" 、"a1c" |
^ |
匹配字符串的开始 | 正则 ^abc 匹配以 "abc" 开头的字符串 |
$ |
匹配字符串的结束 | 正则 xyz$ 匹配以 "xyz" 结尾的字符串 |
* |
匹配前一个字符零次或多次 | 正则 ab* 匹配 "a" 、"ab" 、"abb" |
+ |
匹配前一个字符一次或多次 | 正则 ab+ 匹配 "ab" 、"abb" |
? |
匹配前一个字符零次或一次 | 正则 ab? 匹配 "a" 、"ab" |
{n} |
匹配前一个字符恰好 n 次 | 正则 a{3} 匹配 "aaa" |
{n,} |
匹配前一个字符至少 n 次 | 正则 a{2,} 匹配 "aa" 、"aaa" |
{n,m} |
匹配前一个字符至少 n 次,至多 m 次 | 正则 a{2,4} 匹配 "aa" 、"aaa" 、"aaaa" |
[] |
匹配方括号中的任意一个字符 | 正则 [abc] 匹配 "a" 、"b" 、"c" |
` | ` | 表示逻辑"或" |
\ |
转义符,用于匹配元字符的字面含义 | 正则 \. 匹配 "." |
2. 字符集与范围
字符集通过 []
定义,用于匹配集合中的任意字符。通过 -
可以定义范围:
[abc]
:匹配a
或b
或c
。[0-9]
:匹配任意数字(0 到 9)。[a-zA-Z]
:匹配任意大小写字母。[^abc]
:匹配除a
,b
,c
之外的任意字符。
3. 常用预定义字符集
预定义字符集是正则表达式的快捷方式,简化了常见模式:
符号 | 描述 | 等价写法 |
---|---|---|
\d |
匹配任意数字(0-9) | [0-9] |
\D |
匹配任意非数字字符 | [^0-9] |
\w |
匹配字母、数字或下划线 | [a-zA-Z0-9_] |
\W |
匹配非字母、数字或下划线 | [^a-zA-Z0-9_] |
\s |
匹配空白字符(空格、制表符等) | [ \t\n\r\f\v] |
\S |
匹配非空白字符 | [^ \t\n\r\f\v] |
4. 分组与反向引用
括号 ()
用于分组,分组的内容可以单独提取或重复使用:
捕获分组:
(abc)
:匹配"abc"
并捕获。- 捕获的内容可以通过
\1
,\2
等引用。
非捕获分组:
(?:abc)
:匹配"abc"
,但不捕获。
三、Java 中正则表达式的实现
Java 提供了 java.util.regex
包,包含两个核心类:
- Pattern:正则表达式的编译表示。
- Matcher:用于执行匹配操作的引擎。
1. Java 基础示例
以下代码展示了如何在 Java 中使用正则表达式进行基本的匹配:
java
import java.util.regex.*;
public class RegexDemo {
public static void main(String[] args) {
String text = "今天是2023年10月8日";
String pattern = "\\d+"; // 匹配一个或多个数字
// 编译正则表达式
Pattern compiledPattern = Pattern.compile(pattern);
// 创建匹配器
Matcher matcher = compiledPattern.matcher(text);
// 查找所有匹配项
while (matcher.find()) {
System.out.println("匹配到的数字: " + matcher.group());
}
}
}
//输出
匹配到的数字: 2023
匹配到的数字: 10
匹配到的数字: 8
2. 替换字符串
使用 String
类的 replaceAll()
方法,可以快速替换匹配的内容:
java
public class ReplaceExample {
public static void main(String[] args) {
String text = "价格是100美元";
String pattern = "\\d+"; // 匹配数字
// 替换数字为 "数字"
String result = text.replaceAll(pattern, "数字");
System.out.println(result); // 输出:价格是数字美元
}
}
3. 验证输入格式
正则表达式常用于验证用户输入是否符合特定规则。以下是一个验证邮箱格式的示例:
java
public class EmailValidation {
public static void main(String[] args) {
String email = "example@domain.com";
String pattern = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}$";
if (email.matches(pattern)) {
System.out.println("邮箱格式正确");
} else {
System.out.println("邮箱格式错误");
}
}
}
4. 提取信息
以下代码展示了如何从日志中提取 IP 地址:
java
import java.util.regex.*;
public class ExtractIP {
public static void main(String[] args) {
String log = "用户访问IP:192.168.1.1,时间:12:30";
String pattern = "\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(log);
if (matcher.find()) {
System.out.println("提取到的IP地址: " + matcher.group());
}
}
}
//输出
提取到的IP地址: 192.168.1.1
5. 拆分字符串
你可以使用 split
方法将字符串按正则模式分割:
java
public class SplitExample {
public static void main(String[] args) {
String text = "apple,banana,orange";
String pattern = ",";
String[] result = text.split(pattern);
for (String fruit : result) {
System.out.println(fruit);
}
}
}
//输出
apple
banana
orange
四、常见正则表达式应用场景
1. 手机号验证
java
String pattern = "^1[3-9]\\d{9}$";
String phone = "13812345678";
System.out.println(phone.matches(pattern)); // 输出:true
2. 提取 HTML 标签内容
java
String html = "<title>正则表达式</title>";
String pattern = "<title>(.*?)</title>";
Matcher matcher = Pattern.compile(pattern).matcher(html);
if (matcher.find()) {
System.out.println(matcher.group(1)); // 输出:正则表达式
}
3. 替换多余空格
java
String text = " 去除 多余 空格 ";
String result = text.replaceAll("\\s+", " ").trim();
System.out.println(result); // 输出:去除 多余 空格
五、总结
正则表达式是一项非常强大的工具,可以极大地提高文本处理的效率。在 Java 中,可以通过 Pattern
和 Matcher
类实现复杂的匹配操作。