java中使用正则表达式
【摘要】 在Java中,正则表达式(Regular Expression)通过 java.util.regex 包实现,主要用于字符串匹配、分割、查找和替换。以下是详细的使用指南和示例: 1. 核心类介绍Pattern:编译正则表达式,生成匹配模式。Matcher:执行匹配操作,提供查找、替换等方法。String 类方法:如 matches()、replaceAll() 等内置正则支持。 2. 基本用...
在Java中,正则表达式(Regular Expression)通过 java.util.regex
包实现,主要用于字符串匹配、分割、查找和替换。以下是详细的使用指南和示例:
1. 核心类介绍
Pattern
:编译正则表达式,生成匹配模式。Matcher
:执行匹配操作,提供查找、替换等方法。String
类方法:如matches()
、replaceAll()
等内置正则支持。
2. 基本用法
(1) 字符串匹配
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
String input = "Java is fun";
String regex = "Java";
// 方法1:String.matches()(完全匹配)
boolean isMatch = input.matches(regex); // false(需完全匹配"Java is fun")
System.out.println(isMatch);
// 方法2:Pattern + Matcher(部分匹配)
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
boolean found = matcher.find(); // true(找到"Java")
System.out.println(found);
}
}
(2) 提取匹配内容
String text = "Email: user@example.com, Backup: backup@test.org";
Pattern emailPattern = Pattern.compile("\\b[\\w.-]+@[\\w.-]+\\b");
Matcher emailMatcher = emailPattern.matcher(text);
while (emailMatcher.find()) {
System.out.println("Found email: " + emailMatcher.group());
}
// 输出:
// Found email: user@example.com
// Found email: backup@test.org
(3) 字符串分割
String csv = "apple,banana,orange";
String[] fruits = csv.split(","); // 按逗号分割
for (String fruit : fruits) {
System.out.println(fruit);
}
(4) 字符串替换
String phone = "123-456-7890";
String formatted = phone.replaceAll("(\\d{3})-(\\d{3})-(\\d{4})", "($1) $2-$3");
System.out.println(formatted); // 输出:(123) 456-7890
3. 常用正则语法
符号 | 含义 | 示例 |
---|---|---|
. |
任意字符(除换行符) | a.c → “abc”, “a1c” |
\\d |
数字 | \\d{3} → “123” |
\\w |
字母、数字、下划线 | \\w+ → “Java_123” |
+ |
1次或多次 | go+l → “gol”, “goool” |
* |
0次或多次 | ab*c → “ac”, “abbc” |
? |
0次或1次 | colou?r → “color” |
{n,m} |
n到m次 | \\d{2,4} → “12”, “123” |
[abc] |
a、b或c | [a-z]+ → “hello” |
^ |
字符串开头 | ^Hello → “Hello…” |
$ |
字符串结尾 | world$ → “…world” |
` | ` | 或 |
\\s |
空白字符(空格、制表符等) | \\s+ → " \t\n" |
\\b |
单词边界 | \\bcat\\b → “cat” |
4. 高级用法
(1) 分组捕获
String date = "2023-10-05";
Pattern datePattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher dateMatcher = datePattern.matcher(date);
if (dateMatcher.matches()) {
String year = dateMatcher.group(1); // "2023"
String month = dateMatcher.group(2); // "10"
String day = dateMatcher.group(3); // "05"
System.out.println(year + "-" + month + "-" + day);
}
(2) 非贪婪匹配
String html = "<div>Hello</div><div>World</div>";
Pattern greedyPattern = Pattern.compile("<div>.*</div>"); // 贪婪匹配
Pattern lazyPattern = Pattern.compile("<div>.*?</div>"); // 非贪婪匹配
Matcher greedyMatcher = greedyPattern.matcher(html);
greedyMatcher.find(); // 匹配整个"<div>Hello</div><div>World</div>"
Matcher lazyMatcher = lazyPattern.matcher(html);
lazyMatcher.find(); // 仅匹配第一个"<div>Hello</div>"
(3) 预定义字符类
String text = "Price: $19.99, Discount: 10%";
Pattern numberPattern = Pattern.compile("\\$\\d+\\.\\d{2}"); // 匹配价格
Matcher numberMatcher = numberPattern.matcher(text);
numberMatcher.find(); // 匹配"$19.99"
5. 性能优化
-
预编译
Pattern
:重复使用时,避免每次创建Pattern
对象。private static final Pattern EMAIL_PATTERN = Pattern.compile("\\b[\\w.-]+@[\\w.-]+\\b"); public boolean isValidEmail(String email) { return EMAIL_PATTERN.matcher(email).matches(); }
-
避免过度回溯:复杂正则可能导致性能问题(如
(a+)+
匹配"aaaaaaaaaaaaaX"
)。
6. 常见正则示例
需求 | 正则表达式 |
---|---|
验证邮箱 | ^[\\w.-]+@[\\w.-]+\\.[a-z]{2,}$ |
提取URL参数 | [?&](\\w+)=([^&#]+) |
匹配手机号(中国) | ^1[3-9]\\d{9}$ |
去除多余空格 | \\s+ → 替换为 " " |
验证密码强度(大小写+数字) | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$ |
7. 工具推荐
- 在线测试工具:Regex101、RegExr
- IDE插件:IntelliJ IDEA的正则表达式测试器(Ctrl+Alt+F7)。
总结
- 简单匹配:直接使用
String.matches()
或String.split()
。 - 复杂操作:使用
Pattern
+Matcher
组合。 - 性能关键场景:预编译
Pattern
并复用。 - 调试技巧:通过
Matcher.group()
和在线工具逐步验证正则逻辑。
通过合理使用正则表达式,可以高效处理文本验证、解析和转换任务。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)