温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java regex贪婪匹配怎么用

发布时间:2026-09-14 06:18:31 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 中,正则的“贪婪匹配”是默认行为。下面从原理 + 示例 + 如何控制三方面说明。


一、什么是贪婪匹配(Greedy)

贪婪匹配:在满足条件的前提下,尽可能多地匹配字符。

Java 中以下量词默认都是贪婪的:

  • *:0 次或多次
  • +:1 次或多次
  • ?:0 次或 1 次
  • {n,m}:n 到 m 次

二、贪婪匹配示例(重点)

示例 1:基本贪婪

String text = "a12345b";
String regex = "a.*b";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
while (m.find()) {
    System.out.println(m.group());
}

输出:

a12345b

✅ .* 会一直吃到最后一个 b


示例 2:多个可能结尾

String text = "a1b2b3b";
String regex = "a.*b";

匹配结果:

a1b2b3b

❗不是 a1b,而是尽可能长


三、对比:贪婪 vs 非贪婪(懒惰)

非贪婪(在量词后加 ?)

String regex = "a.*?b";

匹配:

a1b

✅ 遇到第一个 b 就停止


四、对比示例(非常重要)

正则 匹配结果
a.*b a1b2b3b(贪婪)
a.*?b a1b(懒惰)
a.+b a1b2b3b
a.+?b a1b

五、贪婪 + 分组示例

String text = "<div>hello</div><div>world</div>";
String regex = "<div>(.*)</div>";

匹配到:

hello</div><div>world

如果想只匹配一个:

"<div>(.*?)</div>"

六、常见坑

1️⃣ .* 默认不匹配换行

String text = "a\nb";
String regex = "a.*b"; // 匹配不到

解决:

Pattern.DOTALL
Pattern p = Pattern.compile("a.*b", Pattern.DOTALL);

2️⃣ 贪婪导致“吃掉太多”

✅ 解决思路:

  • 用 .*?
  • 或用更精确字符类,如 [^"]*
"\"([^\"]*)\""

七、总结一句话

Java 正则默认就是贪婪匹配,量词后加 ? 变成非贪婪(懒惰)匹配。

如果你有具体文本 + 想提取的内容,可以贴出来,我可以直接帮你写正则。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手