目录
1. 正则表达式简介
正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串模式的强大工具。它通过定义特定的规则和模式,让我们能够简洁且高效地对文本进行搜索、验证、替换等操作。正则表达式广泛应用于文本处理、数据清理、网页抓取以及编程语言中的字符串操作。
正则表达式的基础在于定义一个模式,这个模式描述了我们希望在文本中找到的字符序列。通过这种方式,我们可以实现复杂的字符串操作,而无需编写大量的代码。
2. 正则表达式示例
2.1 验证
验证是正则表达式的常见用途之一。例如,我们可以使用正则表达式来判断一个字符串是否符合特定的格式,如电子邮件地址、电话号码或邮政编码等。
示例:验证电子邮件地址
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String email = "example@example.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("无效的电子邮件地址");
}
}
}
2.2 匹配
匹配是指从字符串中查找符合特定模式的子字符串。正则表达式提供了多种方法来查找匹配项。
示例:匹配电话号码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "我的电话号码是123-456-7890";
String pattern = "\\d{3}-\\d{3}-\\d{4}";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
if (matcher.find()) {
System.out.println("找到电话号码: " + matcher.group());
} else {
System.out.println("未找到电话号码");
}
}
}
2.3 替换
正则表达式还可以用于替换字符串中的某些部分。replaceAll()
方法可以将匹配到的子字符串替换为指定的内容。
示例:替换文本中的数字
public class RegexExample {
public static void main(String[] args) {
String text = "今天是2024年6月18日";
String pattern = "\\d+";
String replacement = "#";
String newText = text.replaceAll(pattern, replacement);
System.out.println(newText); // 输出: 今天是####年#月##日
}
}
2.4 全文查找
有时我们需要查找所有符合模式的子字符串。findAll()
方法可以返回所有匹配项的列表。
示例:查找所有数字
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;
public class RegexExample {
public static void main(String[] args) {
String text = "我的号码是123,朋友的号码是456";
String pattern = "\\d+";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
List<String> matches = new ArrayList<>();
while (matcher.find()) {
matches.add(matcher.group());
}
System.out.println(matches); // 输出: [123, 456]
}
}
2.5 忽略大小写
在匹配过程中,有时我们希望忽略大小写。这可以通过在正则表达式中使用Pattern.CASE_INSENSITIVE
标志来实现。
示例:忽略大小写的匹配
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "Hello World!";
String pattern = "hello";
Pattern compiledPattern = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher matcher = compiledPattern.matcher(text);
if (matcher.find()) {
System.out.println("找到匹配项: " + matcher.group()); // 输出: 找到匹配项: Hello
} else {
System.out.println("未找到匹配项");
}
}
}
2.6 元字符使用
元字符是正则表达式中的特殊字符,用于构建复杂的模式。常见的元字符包括.
、^
、$
、*
、+
、?
、{}
、[]
、|
、()
等。
示例:使用元字符匹配
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "cat, bat, mat";
String pattern = "[cbm]at";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
while (matcher.find()) {
System.out.println("找到匹配项: " + matcher.group());
}
}
}
2.7 字符集合的使用
字符集合是方括号[]
中包含的一组字符,表示匹配其中任何一个字符。可以使用连字符-
表示范围。
示例:使用字符集合
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "a1b2c3";
String pattern = "[a-c][1-3]";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
while (matcher.find()) {
System.out.println("找到匹配项: " + matcher.group());
}
}
}
2.8 常用正则表达式
以下是一些常用的正则表达式及其用途:
- 匹配电子邮件地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 匹配电话号码(美国):
^\d{3}-\d{3}-\d{4}$
- 匹配邮政编码(中国):
^[1-9]\d{5}(?!\d)$
- 匹配IPv4地址:
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
- 匹配日期(YYYY-MM-DD):
^\d{4}-\d{2}-\d{2}$
- 匹配URL:
^(https?|ftp)://[^\s/$.?#].[^\s]*$
这些正则表达式可以根据具体需求进行调整和优化,以适应不同的应用场景。