在 Java 中,正则的“贪婪匹配”是默认行为。下面从原理 + 示例 + 如何控制三方面说明。
贪婪匹配:在满足条件的前提下,尽可能多地匹配字符。
Java 中以下量词默认都是贪婪的:
*:0 次或多次+:1 次或多次?:0 次或 1 次{n,m}:n 到 m 次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
String text = "a1b2b3b";
String regex = "a.*b";
匹配结果:
a1b2b3b
❗不是 a1b,而是尽可能长
?)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>"
.* 默认不匹配换行String text = "a\nb";
String regex = "a.*b"; // 匹配不到
解决:
Pattern.DOTALL
Pattern p = Pattern.compile("a.*b", Pattern.DOTALL);
✅ 解决思路:
.*?[^"]*"\"([^\"]*)\""
Java 正则默认就是贪婪匹配,量词后加
?变成非贪婪(懒惰)匹配。
如果你有具体文本 + 想提取的内容,可以贴出来,我可以直接帮你写正则。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。