java正则表达式——Greedy、Reluctant和Possessive

摘要:
X{n,m}+X,至少n倍,但不超过m倍贪婪:贪婪;勉强的:勉强的;占有:独占。测试1:软件包ABCD;importjava.util.regex.Matcher;importjava.util.regex.Pattern;PublicclassMainClass{publicstaticvoidmain{Matcherm1=Pattern.compile.matcher;//Greedy Matcherm2=Pattern.cocompile(“w+?”).matcher。//不情愿Matcherm3=Pattern.compile.maatcher;//Exclusive System.out.println;System.out.prprintln;}publicstaticStringpiPei{StringBuffers=newStringBuffer();ini=0;而{s.append;s.append“不匹配!更多与正则表达式相关的内容:java正则规则表、java模式类、java匹配器类、java
数量词
GreedyReluctantPossessive匹配
X?X??X?+X,一次或一次也没有
X*X*?X*+X,零次或多次
X+X+?X++X,一次或多次
X{n}X{n}?X{n}+X,恰好n次
X{n,}X{n,}?X{n,}+X,至少n次
X{n,m}X{n,m}?X{n,m}+X,至少n次,但是不超过m次

Greedy:贪婪的;Reluctant:勉强的;Possessive :独占的。


测试1:

packagejichu;

importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

public classMainClass {
    public static voidmain(String[] args) {
        Matcher m1 = Pattern.compile("\w+").matcher("ababa");//贪婪的
        Matcher m2 = Pattern.compile("\w+?").matcher("ababa");//勉强的
        Matcher m3 = Pattern.compile("\w++").matcher("ababa");//独占的
System.out.println(piPei(m1));
        System.out.println(piPei(m2));
        System.out.println(piPei(m3));
    }

    public staticString piPei(Matcher m) {
        StringBuffer s = newStringBuffer();
        int i = 0;
        while(m.find()) {
            s.append("{匹配子串" + ++i + ":" + m.group() + ";");
            s.append("开始位置:" + m.start() + ";");
            s.append("结束位置:" + m.end() + ";}");
        }
        if (s.length() == 0) {
            s.append("没有匹配到!");
        }
        s.insert(0, "(模式" + m.pattern().pattern() + "):");
        returns.toString();
    }
}

打印:

(模式w+):{匹配子串1:ababa;开始位置:0;结束位置:5;}
(模式w+?):{匹配子串1:a;开始位置:0;结束位置:1;}{匹配子串2:b;开始位置:1;结束位置:2;}{匹配子串3:a;开始位置:2;结束位置:3;}{匹配子串4:b;开始位置:3;结束位置:4;}{匹配子串5:a;开始位置:4;结束位置:5;}
(模式w++):{匹配子串1:ababa;开始位置:0;结束位置:5;}

从测试1中可知:

1、对于贪婪的,会一次性匹配所有的字符;

2、对于勉强的,会从左到右一个一个的匹配;

3、对于独占的,与贪婪的一样也是一次性匹配所有的字符;

测试2:(在测试1的基础上修改main方法)

    public static voidmain(String[] args) {
        Matcher m1 = Pattern.compile("\w+b").matcher("ababa");//贪婪的
        Matcher m2 = Pattern.compile("\w+?b").matcher("ababa");//勉强的
        Matcher m3 = Pattern.compile("\w++b").matcher("ababa");//独占的
System.out.println(piPei(m1));
        System.out.println(piPei(m2));
        System.out.println(piPei(m3));
    }

打印:

(模式w+b):{匹配子串1:abab;开始位置:0;结束位置:4;}
(模式w+?b):{匹配子串1:ab;开始位置:0;结束位置:2;}{匹配子串2:ab;开始位置:2;结束位置:4;}
(模式w++b):没有匹配到!

从测试1、2中可知:

1、对于贪婪的,'w+'已经一次性匹配了所有的字符;当模式后加'b'后,此时不匹配,然后回溯1个字符,匹配成功。

2、对于勉强的,从左到右匹配,匹配出两个子串。

3、对于独占的,'w++'已经一次性匹配了所有的字符;当模式后加'b'后,此时不匹配,与贪婪的不一样的是它不会回溯,所以匹配失败。


总结

1、Greedy数量词为“贪婪的”,如名字一样,多吃多占,它会尽可能多的匹配字符,会回溯。

2、Reluctant数量词为“勉强的”,奉行够用主义,它会尽可能少的匹配字符。

3、Possessive数量词为“独占的”,它会如Greedy一样尽可能多的匹配字符,但是它不会回溯。


更多与正则表达式相关内容:

java正则规则表

java之Pattern类详解

java之Matcher类详解

免责声明:文章转载自《java正则表达式——Greedy、Reluctant和Possessive》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇代码重构 & 代码中的坏味道使用分布式锁时考虑哪些问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

正则表达式模式修正符

模式修正符号在正则表达式定界符之外使用(最后一个斜线“/”之后),例如“php/i”。其中“/php/”是一个正则表达式的模式,而“i”就是修正此模式所使用的修正符号,用来匹配时不区分大小写。模式修正符可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能,而且模式修正符号也可以组合使用,更增强了正则表达式的处理能力。例如“/php/Ui...

linux文本处理常用指令(序列二)

概览 本文主体:介绍4个linux文本处理命令:grep、sed、printf、awk。 基本正则表达式 正则表达式字符 含义 ^word 查找以word开头的文本 word$ 查找以word结尾的文本 . 代表一个任意字符 转义符 * 0到多个字符 [abc] 代表一个字符,这个字符是a或b或c [a-z];[0-9]...

linux基础知识-24

一、正则表达式 正则表达式 (regular expression),简写(regex),用来描述一些表达复杂模式的方法。linux中的grep, vi, find, sed等命令都支持正则表达式。 linux@myccloves:~$ grep '^VER' /etc/os-release VERSION_ID="15.6" VERSION="15.6...

使用正则表达式限制swing (JTextField等) 的输入

之前使用Qt编写Gui程序的时候,可以直接使用正则表达式限制所有输入框,非常方便。 这段时间要做一份课程设计,使用java编写,ui要限制输入,比如只能输入x位数字,输入身份证等。 百度了许多资料,发现了一个JFormattedTextField 的类可以规范输入。 刚开始试用觉得还不错,后来发现一个严重的问题:如果光标不是从最左边插入的话,那么左边的位置...

Linux中正则表达式和字符串的查询、替换(tr/diff/wc/find)

目录 正则表达式 基本正则表达式 扩展正则表达式 grep tr diff du wc find 正则表达式 正则表达式,又称正规表示法、常规表示法( Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式可以用来检查一个...

(20135213)信息安全系统设计基础第一周学习总结(共12课)课程(6~12)

【所有参考资料皆来源与实验楼,特此声明】 【第六课】 文件打包与压缩 实验介绍 Linux 上常用的 压缩/解压 工具,介绍了 zip,rar,tar 的使用。 一、文件打包和解压缩 在讲 Linux 上的解压缩工具之前,有必要先了解以下常见常用的压缩包文件格式。在 Windows 上我们最常见的不外乎这三种*.zip,*.rar,*.7z后缀的压缩文件,...