贪婪的正则表达式

背景

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


贪婪?非贪婪?

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

正则表达式中的 “?” 作为量词使用时,代表的是匹配“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());
        }
    }
}

//打印结果为: 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 正则表达式学习笔记 一篇记录了学习正则表达式的笔记。 1. 转义字符 在 HTMl 中转义字符以 & 符号开头,分...
    heyi_let阅读 441评论 0 0
  • 1. 概述 正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符...
    JRG_Orange阅读 2,623评论 0 50
  • 假设用户需要在HTML 表单中填写姓名、地址、出生日期等。那么在将表单提交到服务器进一步处理前,JavaScrip...
    胖先森阅读 393评论 0 2
  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,198评论 0 9
  • 成功就是大家最羡慕的那个人 但成功的背后 却有很多不为人知的秘密! 今天,我就来说一说我的成功故事 我的业余爱好就...
    李_昀倩阅读 205评论 0 1