一、前言
Java中的正则表达式是一种强大的文本处理工具,它允许你通过特定的模式来匹配、查找、替换或验证字符串。Java的正则表达式功能通过java.util.regex
包提供,其中Pattern
类表示编译后的正则表达式,而Matcher
类则用于对输入字符串进行匹配操作。
二、正则表达式的基础
- 字符类 :如
.
(匹配任意字符)、\d
(匹配数字)、\w
(匹配字母或数字或下划线)等。 - 数量词 :如
*
(匹配0次或多次)、+
(匹配1次或多次)、?
(匹配0次或1次)、{n}
(匹配n次)、{n,}
(匹配n次或更多次)、{n,m}
(匹配n到m次)等。 - 锚点 :如``(匹配字符串的开始)、
$
(匹配字符串的结束)、\b
(匹配单词边界)等。 - 分组和捕获 :用
()
来分组,捕获的组可以通过反向引用进行访问,如\1
、\2
等表示第一、第二个捕获组。 - 或操作 :用
|
表示"或"的关系。 - 转义字符 :在正则表达式中,某些字符具有特殊含义,如果要匹配这些字符本身,需要使用
\
进行转义,如\.
匹配点字符。
三、Java中的正则表达式类
-
Pattern类:
Pattern.compile(String regex)
:将给定的正则表达式编译成一个模式。Pattern.matcher(CharSequence input)
:创建一个匹配器,用于将输入序列与该模式进行匹配。
-
Matcher类:
boolean matches()
:尝试将整个区域与模式匹配。boolean lookingAt()
:尝试从输入序列的开头开始匹配模式。boolean find()
:尝试在输入序列中查找与该模式匹配的下一个子序列。int start()
/int end()
:返回当前匹配的起始和结束索引。String group()
/String group(int group)
:返回由之前的匹配操作所匹配的输入子序列,或指定组的子序列。
四、常见应用场景
- 校验输入:使用正则表达式来校验用户输入的格式,如邮箱地址、电话号码、身份证号码等。
- 文本搜索:在大量文本中搜索符合特定模式的字符串,如查找所有包含特定单词的句子。
- 文本替换:将文本中符合特定模式的字符串替换为其他字符串,如将文本中的所有数字替换为星号。
- 字符串分割:根据正则表达式来分割字符串,如将逗号分隔的字符串分割为数组
五、示例代码
以下是一个简单的Java正则表达式示例,用于验证一个字符串是否为有效的电子邮件地址:
java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
// 定义电子邮件地址的正则表达式模式
String regex = "[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 要匹配的输入字符串
String input = "example@example.com";
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 进行匹配操作并输出结果
if (matcher.matches()) {
System.out.println("有效的电子邮件地址!");
} else {
System.out.println("无效的电子邮件地址!");
}
}
}
以下是一个简单的示例,演示如何使用Java正则表达式来匹配字符串中的数字:
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// 定义正则表达式模式
String regex = "\\d+";
// 编译正则表达式模式
Pattern pattern = Pattern.compile(regex);
// 要匹配的输入字符串
String input = "The number is 12345 and the other number is 67890.";
// 获取Matcher对象
Matcher matcher = pattern.matcher(input);
// 查找并打印所有匹配的数字
while (matcher.find()) {
System.out.println("Found number: " + matcher.group());
}
}
}
以下是一个简单的示例,演示如何使用Java正则表达式来验证电话号码:
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PhoneNumberValidator {
private static final String PHONE_NUMBER_REGEX = "^1[34578]\\d{9}$";
public static boolean validatePhoneNumber(String phoneNumber) {
Pattern pattern = Pattern.compile(PHONE_NUMBER_REGEX);
Matcher matcher = pattern.matcher(phoneNumber);
return matcher.matches();
}
public static void main(String[] args) {
String phoneNumber = "13800138000";
boolean isValid = validatePhoneNumber(phoneNumber);
System.out.println("电话号码是否有效: " + isValid);
}
}
以下是一个简单的示例,演示如何使用Java正则表达式来验证身份证号码:
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IDCardValidator {
// 15位身份证正则表达式
private static final String IDCARD15_REGEX = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
// 18位身份证正则表达式
private static final String IDCARD18_REGEX = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}(\\d|X|x)$";
public static boolean isValidIDCard(String idCard) {
Pattern pattern15 = Pattern.compile(IDCARD15_REGEX);
Pattern pattern18 = Pattern.compile(IDCARD18_REGEX);
Matcher matcher15 = pattern15.matcher(idCard);
Matcher matcher18 = pattern18.matcher(idCard);
return matcher15.matches() || matcher18.matches();
}
public static void main(String[] args) {
String idCard = "11010519491231002X";
boolean isValid = isValidIDCard(idCard);
System.out.println("身份证号码是否有效: " + isValid);
}
}