测试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. typeof

    1.用法 typeof num typeof(num) 2.返回值    "number"."string"."boolean"." ...

  2. Fragment 的生命周期及使用方法详解

    Fragment 的基础知识介绍 1.1 概述 1.1.1 特性 By hebang32624 Fragment 是 activity 的界面中的一部分或一种行为.可以把多个 Fragment 组合到 ...

  3. memcached哈希表操作主要逻辑笔记

    以下注释的源代码都在memcached项目的assoc.c文件中 /* how many powers of 2's worth of buckets we use */ unsigned int h ...

  4. Sasha and Interesting Fact from Graph Theory CodeForces - 1109D (图论,计数,Caylay定理)

    大意: 求a->b最短路长度为m的n节点树的个数, 边权全部不超过m 枚举$a$与$b$之间的边数, 再由拓展$Caylay$定理分配其余结点 拓展$Caylay$定理 $n$个有标号节点生成k ...

  5. 『Python』pycharm常用设置

    学习一下pycharm的快捷操作,提升速度,也提升舒适度,笑. 常用快捷键 ctrl + d :复制粘贴本行到下一行 ctrl + y :删除本行 ctrl + 鼠标点击 :跳转 ctrl + / : ...

  6. Hackintosh Power Management

    Also, be aware that hibernation (suspend to disk or S4 sleep) is not supported on hackintosh. You sh ...

  7. UVA-1374 Power Calculus (迭代加深搜索)

    题目大意:问最少经过几次乘除法可以使x变成xn. 题目分析:迭代加深搜索. 代码如下: # include<iostream> # include<cstdio> # incl ...

  8. Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)

    在配置openstack项目时很多人认为到处是坑,特别是新手,一旦进坑没有人指导,身体将会感觉一次次被掏空,作为菜鸟的我也感同身受,因为已经被掏空n次了. 以下也是我将整个openstack配置过程进 ...

  9. vEthernet(默认交换机) 无法访问网络

    VMware 开启虚拟机 最近公司由无线网转为有线时,我用VMware Workstation Pro装的几个系统,其中一个 ubuntu无法访问网页,在ubuntu运行ifconfig -a ,直接 ...

  10. kernel build command

    Uboot: make ARCH=arm CROSS_COMPILE=${CC} distclean make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defc ...