贪婪模式与非贪婪模式
正则表达式默认的匹配是贪婪模式,即总是尽可能匹配更多的字符串。
在正则表达式的后面加
?
则会使用非贪婪模式匹配,即总是尽可能少的匹配。
例如:
“\d+” 去匹配"10292399992",则会匹配全部的字符串
"\d+?“去匹配 “10292399992”,则只匹配"1”
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* [简要描述]: 贪婪匹配和非贪婪匹配
* [详细描述]:
*
* @author Smalight Lv
* @version 1.0, 2021/4/30 10:04
* @since JDK 1.8
*/
public class GreedMode {
public static void main(String[] args) {
String str = "10292399992";
Pattern pGreed = Pattern.compile("\\d+");
Pattern pUnGreed = Pattern.compile("\\d+?");
Matcher matcherGreed = pGreed.matcher(str);
Matcher matcherUnGreed = pUnGreed.matcher(str);
if(matcherGreed.find()){
System.out.println("贪婪匹配:" + matcherGreed.group(0));
}
if(matcherUnGreed.find()){
System.out.println("非贪婪匹配:" + matcherUnGreed.group(0));
}
}
}
运行结果:
贪婪匹配:10292399992
非贪婪匹配:1
"\\d?"
这里的?是指匹配0个或一个数字,是贪婪模式尽可能的匹配1个字符。
"\\d??"
这里的第2个?则是指非贪婪模式,这个正则表达式则会尽可能的匹配0个数字。
在一个线上商城APP中,查询商品信息的接口返回的数据内容如下:
{
“goodsId”:“10000”,
“goodsName”:“长征五号”,
“price”:“100000000000.00”
}
如果要用正则表达式提取商品名称,我们试一下贪婪模式和非贪婪模式
“\“goodsName\”:”(.+)"“匹配的结果是:“goodsName”:“长征五号”,“price”:“100000000000.00”
“\“goodsName\”:”(.+?)”"匹配的结果是:“goodsName”:“长征五号”
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* [简要描述]:贪婪模式与非贪婪模式
* [详细描述]:
*
* @author Smalight Lv
* @version 1.0, 2021/4/30 10:53
* @since JDK 1.8
*/
public class GreedMode2 {
public static void main(String[] args) {
String str = "{\"goodsId\":\"10000\",\"goodsName\":\"长征五号\",\"price\":\"100000000000.00\"}";
Pattern pGreed = Pattern.compile("\"goodsName\":\"(.+)\"");
Pattern pUnGreed = Pattern.compile("\"goodsName\":\"(.+?)\"");
Matcher matcherGreed = pGreed.matcher(str);
Matcher matcherUnGreed = pUnGreed.matcher(str);
if(matcherGreed.find()){
System.out.println("贪婪匹配:" + matcherGreed.group(0));
System.out.println("商品名称:" + matcherGreed.group(1));
}
if(matcherUnGreed.find()){
System.out.println("非贪婪匹配:" + matcherUnGreed.group(0));
System.out.println("商品名称:" + matcherUnGreed.group(1));
}
}
}
运行结果:
贪婪匹配:"goodsName":"长征五号","price":"100000000000.00"
商品名称:长征五号","price":"100000000000.00
非贪婪匹配:"goodsName":"长征五号"
商品名称:长征五号