正则表达式中Greedy、Reluctant、Possessive数量词的区别

首先看一下API文档里的定义:
这里写图片描述

再从字面意义上看:
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 数量词是直接匹配整个字符串,如果完全匹配就匹配成功,否则匹配失败,所以匹配不成功,也就没有返回值。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部