正则表达式(四)之贪婪模式与非贪婪模式

贪婪模式与非贪婪模式


正则表达式默认的匹配是贪婪模式,即总是尽可能匹配更多的字符串。
在正则表达式的后面加 ?则会使用非贪婪模式匹配,即总是尽可能少的匹配。
例如:
“\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":"长征五号"
商品名称:长征五号
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小亮点科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值