正则表达式中Greedy、Reluctant、Possessive数量词的区别
2017-11-02 00:01
543 查看
首先看一下API文档里的定义:
再从字面意义上看:
Greedy —-贪婪的
Reluctant —-勉强的,不情愿的
Possessive—-所有的,所有格的
Greedy 数量词(贪婪的)
它的匹配方式是先把整个字符串吞下,然后匹配整个字符串,如果不匹配,就从右端吐出一个字符,再进行匹配,直到找到匹配或把整个字符串吐完为止。
Reluctant 数量词(勉强的,不情愿的)
它先从最小匹配开始,先从左端吞入一个字符,然后进行匹配,若不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止。
Possessive 数量词(所有的,所有格的)
直接匹配整个字符串,如果完全匹配就匹配成功,否则匹配失败。效果相当于equals()。
2015年搜狗Java工程师笔试题:
正则表达式中:(?=X) X,通过零宽度的正 lookahead,即下一个符号为X。“(?=\()”,即表示下一个字符为’(‘。
使用Greedy 数量词进行匹配:
使用Reluctant 数量词进行匹配:
使用Possessive 数量词进行匹配:
这道笔试题的要求是:截取字符串中第一个出现的英文左括号之前的字符串。
Greedy 数量词是先匹配整个字符串,然后依次去掉最右端的一个字符再进行匹配,所以结果为:北京市(海淀区)(朝阳区)。
Reluctant 数量词是从最左边一个字符开始匹配,不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止,所以这个符合题意。
Possessive 数量词是直接匹配整个字符串,如果完全匹配就匹配成功,否则匹配失败,所以匹配不成功,也就没有返回值。
再从字面意义上看:
Greedy —-贪婪的
Reluctant —-勉强的,不情愿的
Possessive—-所有的,所有格的
Greedy 数量词(贪婪的)
它的匹配方式是先把整个字符串吞下,然后匹配整个字符串,如果不匹配,就从右端吐出一个字符,再进行匹配,直到找到匹配或把整个字符串吐完为止。
Reluctant 数量词(勉强的,不情愿的)
它先从最小匹配开始,先从左端吞入一个字符,然后进行匹配,若不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止。
Possessive 数量词(所有的,所有格的)
直接匹配整个字符串,如果完全匹配就匹配成功,否则匹配失败。效果相当于equals()。
2015年搜狗Java工程师笔试题:
正则表达式中:(?=X) X,通过零宽度的正 lookahead,即下一个符号为X。“(?=\()”,即表示下一个字符为’(‘。
使用Greedy 数量词进行匹配:
public class RegexTest { public static void main(String[] args) { String str = "北京市(海淀区)(朝阳区)(西城区)"; String Greedy_regex = ".*(?=\\()"; Pattern pattern = Pattern.compile(Greedy_regex); Matcher matcher = pattern.matcher(str); String subString = null; if(matcher.find()) { subString = matcher.group(); System.out.println(subString); } } } //打印结果为:北京市(海淀区)(朝阳区)
使用Reluctant 数量词进行匹配:
public class RegexTest { public static void main(String[] args) { String str = "北京市(海淀区)(朝阳区)(西城区)"; String Reluctant_regex = ".*?(?=\\()"; Pattern pattern = Pattern.compile(Reluctant_regex); Matcher matcher = pattern.matcher(str); String subString = null; if(matcher.find()) { subString = matcher.group(); System.out.println(subString); } } } //打印结果为:北京市
使用Possessive 数量词进行匹配:
public class RegexTest { public static void main(String[] args) { String str = "北京市(海淀区)(朝阳区)(西城区)"; String Possessive_regex = ".*+(?=\\()"; Pattern pattern = Pattern.compile(Possessive_regex); Matcher matcher = pattern.matcher(str); String subString = null; if(matcher.find()) { subString = matcher.group(); System.out.println(subString); } } } //打印结果为:空
这道笔试题的要求是:截取字符串中第一个出现的英文左括号之前的字符串。
Greedy 数量词是先匹配整个字符串,然后依次去掉最右端的一个字符再进行匹配,所以结果为:北京市(海淀区)(朝阳区)。
Reluctant 数量词是从最左边一个字符开始匹配,不匹配就再吞入一个字符,直到找到匹配或将整个字符串吞入为止,所以这个符合题意。
Possessive 数量词是直接匹配整个字符串,如果完全匹配就匹配成功,否则匹配失败,所以匹配不成功,也就没有返回值。
相关文章推荐
- 总算是明白 java正则表达式 中 Greedy 、Reluctant 、Possessive数量词的区别了
- 正则表达式:Greedy、Reluctant、Possessive 区别
- Java中的正则表达式中Greedy,Reluctant和Possessive数量词的区别
- 【转载】JAVA正则表达式的三种模式的区别-greedy reluctant possessive
- java基础巩固系列(十三):java正则表达式中的数量词:Greedy、Reluctant、Possessive
- 正则表达式Greedy、Reluctant、Possessive三种策略的区别
- java 正则表达式Greedy、Reluctant、Possessive的理解
- java正则表达式——Greedy、Reluctant和Possessive
- Java正则表达中Greedy Reluctant Possessive 的区别
- Java正则中的Greedy、Reluctant 、Possessive
- greedy、reluctant和possessive量词的区别
- java正则表达式中的数量词介绍及区别
- Java正则表达式 Possessive 数量词的理解
- [转载]正则表达式 的greedy、reluctant和possessive量词
- greedy、reluctant和possessive量词的区别
- js正则表达式test方法、exec方法与字符串search方法区别
- JAVA正则表达式,matcher.find()和 matcher.matches()的区别
- POSIX 和 PCRE 标准的正则表达式区别
- 考题:正则表达式 .*? 和 .* 有区别吗?
- 正则表达式中/i,/g,/ig,/gi,/m的区别和含义