Java中的正则表达式中Greedy,Reluctant和Possessive数量词的区别
2016-01-31 15:40
645 查看
在Java深入学习的过程中,我在阅读JDK1.6的API时,在Pattern类的构造器摘要中发现了匹配数量词有三种模式,分别是Greedy,Reluctant和Possessive
JDK1.6的中文版API对它们的说明分别如下:
正则表达式中,默认情况下基本上都是使用Greedy数量词
例如字符串"qwert12345",可以匹配它的正则表达式为".*5".其中"."可以匹配任何字符,"*"表示匹配0次或多次,程序在编译运行时,"qwert12345"字符串本身可以被".*"匹配,但是后边多了个"5"无法匹配,因此回溯一个字符,正好匹配了"5",所以返回true.
Reluctant数量词在匹配时,与Greedy的匹配模式是相反的,它从左到右一个一个进行匹配,而不是匹配字符串再进行回溯
例如字符串"qwert12345",".*?3"也是匹配的,因为从左到右一个一个看只有整个字符串才能匹配,儿对于正则表达式".+?"来说,职匹配最左边的字符q,如果正则表达式是".*?"则意味着没有匹配任何字符串.
Possessive数量词与Greedy数量词类似,也是匹配字符串.唯一的不同时Possessive不回溯,所以对于"qwert12345",".*+3"不匹配.
JDK1.6的中文版API对它们的说明分别如下:
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
例如字符串"qwert12345",可以匹配它的正则表达式为".*5".其中"."可以匹配任何字符,"*"表示匹配0次或多次,程序在编译运行时,"qwert12345"字符串本身可以被".*"匹配,但是后边多了个"5"无法匹配,因此回溯一个字符,正好匹配了"5",所以返回true.
Reluctant 数量词 | |
---|---|
X?? | X,一次或一次也没有 |
X*? | X,零次或多次 |
X+? | X,一次或多次 |
X{n}? | X,恰好 n 次 |
X{n,}? | X,至少 n 次 |
X{n,m}? | X,至少 n 次,但是不超过 m 次 |
例如字符串"qwert12345",".*?3"也是匹配的,因为从左到右一个一个看只有整个字符串才能匹配,儿对于正则表达式".+?"来说,职匹配最左边的字符q,如果正则表达式是".*?"则意味着没有匹配任何字符串.
Possessive 数量词 | |
---|---|
X?+ | X,一次或一次也没有 |
X*+ | X,零次或多次 |
X++ | X,一次或多次 |
X{n}+ | X,恰好 n 次 |
X{n,}+ | X,至少 n 次 |
X{n,m}+ | X,至少 n 次,但是不超过 m 次 |
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Manifest 用法
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 什么是 GraphQL?
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Spark RDD API详解(一) Map和Reduce
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- msql 正则表达式
- 正则表达式