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

测试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的更多相关文章
- Java正则表达中Greedy Reluctant Possessive 的区别
Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java 目录 ...
- 关于 Java正则表达式中的Possessive数量修饰词的理解
关于 Java正则表达式中的Possessive数量修饰词的理解 正则表达式对于数量限定符如 ?, + , *, {n, m} 的匹配默认是贪婪模式,比如: a.*b 匹配 acbab 的结果是 ...
- Java正则表达式的解释说明
1.字符x 字符 x.例如a表示字符a\\ 反斜线字符.在书写时要写为\\\\.(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1 ...
- java正则表达式语法详解及其使用代码实例
原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...
- Java正则表达式语法
Java正则表达式 表达式意义: 1.字符 x 字符 x.例如a表示字符a \\ 反斜线字符.在书写时要写为\\\\.(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在 ...
- Java正则表达式实例详解
创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...
- java正则表达式
java正则表达式 1.Java正则表达式的语法与示例: http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式: http://www.runo ...
- Java正则表达式入门——转自RUNOOB.COM
Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java正则表达式和Perl的是最为相似 ...
- Java 正则表达式详解
Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...
随机推荐
- codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)
题意:求使pi(n)*q<=rub(n)*p成立的最大的n. 先收集所有的质数和回文数.质数好搜集.回文数奇回文就0-9的数字,然后在头尾添加一个数.在x前后加a,就是x*10+a+a*pow( ...
- nyoj-1367-河南省第十一届省赛-E物流配送-最小费用流
1367-物流配送 内存限制:128MB 时间限制:8000ms 特判: No通过数:1 提交数:1 难度:4 题目描述: 物流配送是物流活动中一种非单一的业务形式,它与物品流动.资金流动紧密结合.备 ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理
前言: 记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别? 促使我对进程池进了知识的学习,所以记录一下学习 ...
- java 中利用异或实现两个变量互换
一般实现两个变量之间的互换要用第三个变量,这样做可以,但创建新变量,增加了系统开销.如果要交换的变量时两个整数型变量,可以用更高效的方法.例如:^(异或)操作,举例如下: package chapte ...
- OC Copy和Property
- Prism 4 文档 ---第11章 部署Prism应用程序
要成功移动Prism应用到生产中,需要对部署计划为应用程序的设计过程的一部分.本章介绍了注意事项和你需要采取的准备以部署应用程序,以及你要在用户手中获得部署程序所需要采取的行动. Si ...
- Python Threading多线程简单例子
业务监控,多线程例子,实现每类个监控项的不同监控间隔. #coding=utf-8import sysimport pymysqlimport osfrom prometheus_client imp ...
- 配置pycharm 一键安装 requirements.txt,一键生成requirements.txt
如上配置 打开项目,在requirements.txt上点右键,就可以安装了. 安装效果如下: 可以看出运行的命令是 C:\Python\Python36/scripts/pip install ...
- struts2 的学习
1.struts.xml 中的action不是代表一个action类(控制器),而是代表一次访问,所以action的name属性和访问路径有关.配置文件中的package的namespace属性其实就 ...
- 《Python》 函数进阶和名称空间作用域
函数进阶: 一.动态参数:*args **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...