美文网首页
贪婪的正则表达式

贪婪的正则表达式

作者: wayenmao | 来源:发表于2020-01-17 16:08 被阅读0次

背景

工作中遇到正则表达式匹配失误的问题,虽最终解决了问题。但讨论过程中提到了贪婪和非贪婪,
大家都不是讲的十分清楚。随后做了一些了解,记录如下。


贪婪?非贪婪?

简言之贪婪就是尽量找最长的匹配字符串,非贪婪尽量找最短的匹配字符串。

正则表达式中的 “?” 作为量词使用时,代表的是匹配“0次或1次”。但“?”跟在量词后面就表示以非贪婪模式匹配。

​ 正则表达式常用量词如下:

* 匹配0次或多次
? 匹配0次或1次
+ 匹配1次或多次
{m,n} 匹配大于等于m次,小于等于n次 (n>m)
{m,} 匹配大于等于m次

Example

我们用 regexp:abcd123 这个字符串来做一下例子

Example1:

{m,n} 与 {m,n}?

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]{3,5}";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: regex

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]{3,5}?";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: reg

Example2:

{m,}与{m,}?

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]{3,}";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: regexp

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]{3,}?";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: reg

Example3:

?

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]*";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: regexp

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]*?";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: 

Example4:

+与+?

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]+";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: regex

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]+?";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: r

Example4:

?与??

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]?";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: r

public class RegExpTester{
    public static void main(String[] args){
        String str = "regexp:abcd123efg";
        String regexp = "[a-z]??";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()){
            System.out.println(matcher.group());
        }
    }
}

//打印结果为: 

相关文章

  • 正则表达式的贪婪模式和非贪婪模式

    一、什么是贪婪模式和非贪婪模式? 定义 贪婪模式:正则表达式趋向于匹配最大长度。 非贪婪模式:正则表达式趋向于匹配...

  • Python基础022--正则表达式

    正则表达式模块、贪婪匹配和非贪婪匹配、正则分组、match和search的使用 常用的正则表达式元字符 正则表达式...

  • 正则表达式系列-4

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 贪婪与懒惰 贪婪匹配:匹配尽可能多的字符...

  • 贪婪与非贪婪匹配

    1.什么是正则表达式的贪婪与非贪婪匹配 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使...

  • 正则表达式

    基础正则表达式 拓展正则表达式 贪婪与懒惰

  • 正则表达式

    贪婪模式和非贪婪模式 正则表达式是贪婪匹配的。比如:'123456789'.replace(/\d{3,6}/g,...

  • 正则表达式

    正则表达式 (?P .*)提取字符串re.M,re.S,贪婪,非贪婪正则表达式,html标签 提取Python正则...

  • 正则表达式速查

    正则表达式速查 正则表达式默认为“贪婪”,最大匹配;在量词后加?可改为“非贪婪” 常用代码 匹配要求代码任意汉字[...

  • JavaScript 正则表达式( 匹配网页的图片地址)

    正则表达式 - 元字符 贪婪模式与非贪婪模式 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为;贪婪模式 在...

  • 爬取图片和文字链接并保存

    1正则表达式 贪婪与非贪婪 例如r'src="(.+?/.jpg)”就是图片 而r'src="(.+/.jpg)”...

网友评论

      本文标题:贪婪的正则表达式

      本文链接:https://www.haomeiwen.com/subject/ddaczctx.html