正则表达式与字符串
正则表达式用于字符串模式匹配和处理。
正则表达式概念
什么是正则表达式
正则表达式是描述字符串模式的规则,用于匹配、查找、替换字符串。
Java
// 正则表达式示例
String regex = "\\d+"; // 匹配数字
String regex2 = "[a-z]+"; // 匹配小写字母
String类正则方法
matches判断匹配
Java
String str = "12345";
// 判断是否全是数字
boolean isDigit = str.matches("\\d+"); // true
// 判断邮箱格式
String email = "test@example.com";
boolean isEmail = email.matches("[\\w.]+@[\\w.]+\\.[\\w]+"); // true
// 判断手机号
String phone = "13812345678";
boolean isPhone = phone.matches("1[3-9]\\d{9}"); // true
replaceAll全部替换
Java
String str = "Hello123World456";
// 替换所有数字
String r1 = str.replaceAll("\\d", ""); // "HelloWorld"
// 替换所有数字为X
String r2 = str.replaceAll("\\d+", "X"); // "HelloXWorldX"
// 替换所有空白
String str2 = "a b c";
String r3 = str2.replaceAll("\\s+", " "); // "a b c"
replaceFirst首次替换
Java
String str = "aaa bbb ccc";
// 只替换第一个匹配
String r = str.replaceFirst("\\w+", "XXX");
// "XXX bbb ccc"
split正则分割
Java
String str = "a1b2c3d";
// 按数字分割
String[] arr = str.split("\\d"); // ["a", "b", "c", "d"]
// 按多个分隔符分割
String str2 = "a,b;c|d";
String[] arr2 = str2.split("[,;|]"); // ["a", "b", "c", "d"]
// 限制分割次数
String str3 = "a,b,c,d";
String[] arr3 = str3.split(",", 2); // ["a", "b,c,d"]
Pattern和Matcher类
Pattern编译正则
Java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
// 编译正则表达式
Pattern pattern = Pattern.compile("\\d+");
Matcher匹配操作
Java
String str = "Hello123World456";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);
// find查找匹配
while (matcher.find()) {
String match = matcher.group(); // 获取匹配内容
System.out.println(match); // 输出:123, 456
}
Matcher常用方法
Java
Matcher matcher = pattern.matcher(str);
// matches:整个字符串是否匹配
boolean allMatch = matcher.matches();
// find:查找下一个匹配
boolean found = matcher.find();
// group:获取匹配内容
String content = matcher.group();
// start:匹配开始位置
int start = matcher.start();
// end:匹配结束位置
int end = matcher.end();
// replaceAll:替换所有匹配
String replaced = matcher.replaceAll("X");
匹配示例
Java
String str = "2026-05-09";
// 匹配日期
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher(str);
if (matcher.matches()) {
String year = matcher.group(1); // "2026"(第一组)
String month = matcher.group(2); // "05"(第二组)
String day = matcher.group(3); // "09"(第三组)
System.out.println(year + "-" + month + "-" + day);
}
常用正则元字符
基本元字符
| 元字符 | 说明 | 示例 |
|---|---|---|
| . | 任意字符 | "a.c"匹配abc |
| \d | 数字[0-9] | "\d+"匹配123 |
| \D | 非数字 | "\D+"匹配abc |
| \w | 字母数字下划线 | "\w+"匹配abc123 |
| \W | 非字母数字 | "\W+"匹配空格等 |
| \s | 空白字符 | "\s+"匹配空格 |
| \S | 非空白字符 | "\S+"匹配内容 |
数量限定符
| 限定符 | 说明 | 示例 |
|---|---|---|
| * | 0次或多次 | "a*"匹配空或aaa |
| + | 1次或多次 | "a+"匹配a或aaa |
| ? | 0次或1次 | "a?"匹配空或a |
| {n} | 恰好n次 | "a{3}"匹配aaa |
| {n,} | 至少n次 | "a{2,}"匹配aa或aaa |
| {n,m} | n到m次 | "a{2,4}"匹配aa到aaaa |
字符集
| 语法 | 说明 | 示例 |
|---|---|---|
| [abc] | a或b或c | "[abc]"匹配a |
| [a-z] | a到z范围 | "[a-z]+"匹配abc |
| [0-9] | 0到9数字 | "[0-9]+"匹配123 |
| [^abc] | 非abc | "[^abc]"匹配d |
| [^a-z] | 非小写字母 | "[^a-z]"匹配A |
位置限定符
| 限定符 | 说明 |
|---|---|
| ^ | 开头 |
| $ | 结尾 |
| \b | 单词边界 |
Java
// 开头匹配
String str = "Hello";
boolean start = str.matches("^H.*"); // true
// 结尾匹配
boolean end = str.matches(".+o$"); // true
// 单词边界
String str2 = "hello world";
Pattern p = Pattern.compile("\\bworld\\b");
Matcher m = p.matcher(str2);
m.find(); // 匹配world(单词边界)
分组与选择
| 语法 | 说明 | 示例 |
|---|---|---|
| () | 分组 | "(ab)+"匹配abab |
| | | 或选择 | "a|b"匹配a或b |
Java
// 分组匹配
String str = "2026-05-09";
Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher(str);
if (m.matches()) {
String year = m.group(1); // 第1组
String month = m.group(2); // 第2组
}
// 或选择
String str2 = "cat";
boolean match = str2.matches("cat|dog"); // true
Java正则转义
双反斜杠转义
Java字符串中\需要转义为\。
Java
// 正则中的\d在Java中写成\\d
String regex = "\\d+"; // 匹配数字
// 正则中的\.在Java中写成\\.
String regex2 = "\\."; // 匹配点号
// 匹配实际反斜杠
String regex3 = "\\"; // 匹配一个反斜杠
常用正则示例
Java
// 数字
String digit = "\\d+"; // 匹配:123
// 邮箱(简化)
String email = "\\w+@\\w+\\.\\w+"; // 匹配:test@example.com
// 手机号
String phone = "1[3-9]\\d{9}"; // 匹配:13812345678
// IP地址(简化)
String ip = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
// 日期
String date = "\\d{4}-\\d{2}-\\d{2}"; // 匹配:2026-05-09
// URL(简化)
String url = "https?://[\\w./]+";
正则应用示例
验证邮箱
Java
String email = "test@example.com";
String regex = "[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}";
boolean valid = email.matches(regex); // true
// 或使用Pattern
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
boolean valid2 = m.matches();
验证手机号
Java
String phone = "13812345678";
String regex = "1[3-9]\\d{9}";
boolean valid = phone.matches(regex); // true
提取数字
Java
String str = "Price: $123.45, Quantity: 100";
Pattern p = Pattern.compile("\\d+(\\.\\d+)?");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
// 输出:123.45, 100
去除HTML标签
Java
String html = "<p>Hello <b>World</b></p>";
String text = html.replaceAll("<[^>]+>", "");
// "Hello World"
验证密码强度
Java
String password = "Abc123!@";
// 至少8位,包含大小写字母、数字、特殊字符
String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
boolean strong = password.matches(regex);
要点总结
- String.matches()判断整个字符串是否匹配
- String.replaceAll()替换所有匹配
- String.replaceFirst()替换第一个匹配
- String.split()正则分割
- Pattern.compile()编译正则表达式
- Matcher.find()查找匹配
- Matcher.group()获取匹配内容
- \d数字,\w字母数字,\s空白
- []字符集,[^]排除字符集
- *0或多,+1或多,?0或1
- {n}恰好n次,{n,m}n到m次
- ^开头,$结尾,\b单词边界
- ()分组,|或选择
- Java中\需写成\(双反斜杠)
📝 发现内容有误?点击此处直接编辑