测试1:

 package jichu;

 import java.util.regex.Matcher;
import java.util.regex.Pattern; public class MainClass {
public static void main(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 static String piPei(Matcher m) {
StringBuffer s = new StringBuffer();
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() + "):");
return s.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 void main(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正则表达式——Greedy、Reluctant和Possessive的更多相关文章

  1. Java正则表达中Greedy Reluctant Possessive 的区别

    Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java   目录 ...

  2. 关于 Java正则表达式中的Possessive数量修饰词的理解

    关于 Java正则表达式中的Possessive数量修饰词的理解 正则表达式对于数量限定符如 ?, + , *, {n, m} 的匹配默认是贪婪模式,比如: a.*b   匹配 acbab 的结果是 ...

  3. Java正则表达式的解释说明

    1.字符x    字符 x.例如a表示字符a\\    反斜线字符.在书写时要写为\\\\.(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1 ...

  4. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  5. Java正则表达式语法

    Java正则表达式 表达式意义: 1.字符 x    字符 x.例如a表示字符a \\    反斜线字符.在书写时要写为\\\\.(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在 ...

  6. Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  7. java正则表达式

    java正则表达式 1.Java正则表达式的语法与示例:  http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式:  http://www.runo ...

  8. Java正则表达式入门——转自RUNOOB.COM

    Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java正则表达式和Perl的是最为相似 ...

  9. Java 正则表达式详解

    Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...

随机推荐

  1. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  2. Codeforces 919D - Substring

    919D - Substring 思路: 拓扑排序判环+DAG上dp+记忆化搜索 状态:dp[i][j]表示以i为起点的路径中j的最大出现次数 初始状态:dp[i][j]=1(i have no so ...

  3. Codeforces 877E - Danil and a Part-time Job(dfs序+线段树)

    877E - Danil and a Part-time Job 思路:dfs序+线段树 dfs序:http://blog.csdn.net/qq_24489717/article/details/5 ...

  4. mysql 将一张表里的数据插入到另一张表

    1. 表结构一样 insert into 表1 select * from 表2 2. 表结构不一样 insert into 表1 (列名1,列名2,列名3) select 列1,列2,列3 from ...

  5. 16S 基础知识、分析工具和分析流程详解

    工作中有个真理:如果你连自己所做的工作的来龙去脉都讲不清楚,那你是绝对不可能把这份工作做好的. 这适用于任何行业.如果你支支吾吾,讲不清楚,那么说难听点,你在混日子,没有静下心来工作. 检验标准:随时 ...

  6. CDS & ORF & 启动子 & 终止子 & 转录因子 & 基因结构 & UTR

    ORF和CDS的区别 ORF的英文展开是open reading frame(开放阅读框). CDS的英文展开是coding sequences (编码区). CDS:DNA转录成mRNA,mRNA经 ...

  7. gradle 编译 No such property: sonatypeUsername错误解决

    No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...

  8. hdu-1404-博弈+打表

    Digital Deletions Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. NOJ-1581 筷子 (线性DP)

    题目大意:有n支筷子,已知长度,定义一双筷子的质量等于长度的平方差,问能否分成k双?若能,输出所有筷子的最小质量和. 题目分析:先将筷子按长度从小到大排序,定义状态dp(i,j)表示将前 i 支筷子分 ...

  10. datafile相关(add、rename、drop)

    --case 1 add14:25:04 FPYJ(150_9)@test> alter tablespace fpyj_data02 add datafile '/oradata02/test ...