先说结论:以非贪婪的方式匹配正则表达式".*"
举例子:
String s = "abdcababc";
String regx1 = "ab(.*)c";
String regx2 = "ab(.*?)c";
Pattern pattern1 = Pattern.compile(regx1);
Pattern pattern2 = Pattern.compile(regx2);
Matcher matcher1 = pattern1.matcher(s);
Matcher matcher2 = pattern2.matcher(s);
matcher1.find();
System.out.println(matcher1.group(1)); // 输出 dcabab
matcher2.find();
System.out.println(matcher2.group(1)); // 输出 d
详细解释
首先分别看下 . * ? 的用法
图片引用自菜鸟教程:java正则表达式|菜鸟教程
直接看定义似乎很难理解 「.*?」整体所表达的意思,想要理解首先要知道贪婪匹配和非贪婪匹配。
正则表达式在匹配字符串的过程中可能会出现多个匹配的情况,贪婪匹配会尽量匹配最长的结果,非贪婪则尽量匹配最短的结果。
在java中,正则表达式默认使用贪婪匹配,如果想使用非贪婪匹配,则需要在表达式的后面加上「?」
所以「.*?」是用非贪婪放方式匹配正则表达式「.*」