java中使用正则表达式

举报
福州司马懿 发表于 2025/09/21 18:30:55 2025/09/21
【摘要】 在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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。