博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则数量词及非捕获
阅读量:7252 次
发布时间:2019-06-29

本文共 3480 字,大约阅读时间需要 11 分钟。

  hot3.png

一、数量词:Greedy Reluctant Possessive                

        String str = "abcdabg";				// ①Greedy		// output:abcdab 		Pattern pattern1 = Pattern.compile(".*ab");		Matcher matcher1 = pattern1.matcher(str);		while (matcher1.find()) {			System.out.print(matcher1.group() + " ");		}		System.out.println();				// ②Reluctant		// output:ab cdab 		Pattern pattern2 = Pattern.compile(".*?ab");		Matcher matcher2 = pattern2.matcher(str);		while (matcher2.find()) {			System.out.print(matcher2.group() + " ");		}		System.out.println();				// ③Possessive 		// no output		Pattern pattern3 = Pattern.compile(".*+ab");		Matcher matcher3 = pattern3.matcher(str);		while (matcher3.find()) {			System.out.println(matcher3.group());		}
1.Greedy:贪婪,表示匹配的时候先匹配整个字符串,如果匹配成功,则终止,如果不匹配,再从右向左一个一个吐出来(因为他太贪婪了),过程如下:

模式:.*ab,要匹配的字符abcdabg,注意是.*来匹配

1.先匹配abcdabg,不成功

2.匹配abcdab,还是不成功

3.匹配abcda,还是不成功

4.匹配abcd,匹配成功,后面刚好是ab

所以最终输出的是abcdab

2.Reluctant 勉强,匹配过程是从左到右,先从最左边吃掉一个字符,不匹配的话接着吃点(我很不愿意,所以很勉强),一直到匹配的,但这时不会退出,而是继续匹配,过程如下:

模式:.*?ab,要匹配的字符abcdabg,注意是.*来匹配

1.先匹配a,不成功

2.匹配ab,成功,继续匹配

3.匹配c,不成功

4.匹配cd,成功,后面刚好是ab

5.匹配cda,不成功,继续匹配到末尾

所以最终输出的是ab cdab

3.Possessive 侵占,表示我一次性匹配整个字符串,而且只匹配一次,要么成功,要么不成功 

模式:.*+ab,要匹配的字符abcdabg,注意是.*来匹配

1.直接匹配abcdabg,.*直接吃掉整个字符串了,没有字符来匹配后面的ab了,当然是不匹配了,然后就终止了,所以没有任何输出

二、捕获与非捕获

这2个都是用()来包起来的,看下面的例子就知道2者的区别了

String str = "industries";  // ①捕获 Pattern pattern1 = Pattern.compile("industr(y|ies)"); Matcher matcher1 = pattern1.matcher(str); while (matcher1.find()) { System.out.println(matcher1.group(0) + "+++" + matcher1.group(1)); }  // ②非捕获 Pattern pattern2 = Pattern.compile("industr(?:y|ies)"); Matcher matcher2 = pattern2.matcher(str);  while (matcher2.find()) { System.out.println(matcher1.group(0) + "+++" + matcher2.group(1)); }
结果为:

industries+++iesException in thread "main" java.lang.IllegalStateException: No match found at java.util.regex.Matcher.group(Matcher.java:468) at com.reg.TestAt.main(TestAt.java:47)

对于捕获的,()会被当做一个分组,所以还有一个小标为1的组

但是对于非捕获,是没有组的,所以就出现下标异常了

非捕获

直接看下面的例子比较容易理解:

System.out.println("---------(?=X)---------");		// lookahead 向后看		// (?=X) X,通过零宽度的正 lookahead 		/*表达式"a(?=b)c"不能匹配"abc",也不能匹配"ac"、"ab"。而且不能匹配任何字符串。因为其预测匹配a的位置后,应该是b,但是,又要求a之后是c。		表达式"a(?=b)bc"是可以匹配"abc"的,但是不能匹配"ab"和"ac"。*/		Pattern p1 = Pattern.compile("a(?=c)");		System.out.println(p1.matcher("ac").matches());// 这种是不包含的,所以为false,对比下面的		Matcher matcher1 = p1.matcher("ac");		while(matcher1.find()) {			System.out.println(matcher1.group());// 结果为a		}				System.out.println("---------(?>X)---------");		Pattern p11 = Pattern.compile("a(?>c)");		System.out.println(p11.matcher("ac").matches());// 这种是包含的,所以为true,对比上面的		Matcher matcher11 = p11.matcher("ac");		while(matcher11.find()) {			System.out.println(matcher11.group());		}				System.out.println("---------(?!X)---------");		// (?!X) X,通过零宽度的负 lookahead 		// a(?!c)b 表示a后面不能是c,且是b,所以为true		Pattern p2 = Pattern.compile("a(?!c)b");// a(?!b)b		System.out.println(p2.matcher("ab").matches());				System.out.println("---------(?<=X)---------");		// lookbehind 向前看		// (?<=X) X,通过零宽度的正 lookbehind 		// a(?<=a)c 表示c前面必须是a		Pattern p3 = Pattern.compile("a(?<=a)c");		System.out.println(p3.matcher("ac").matches());				System.out.println("---------(?
X) X,作为独立的非捕获组 // 指针会移动(是包含在内的),注意和(?=X)的区别 Pattern p5 = Pattern.compile("a(?:b)"); System.out.println(p5.matcher("ab").matches()); Pattern p9 = Pattern.compile("a(?>b)"); System.out.println(p9.matcher("ab").matches());
上面例子都理解了,非捕获基本也就理解了,不过实际中用的也不多

转载于:https://my.oschina.net/dxqr/blog/398567

你可能感兴趣的文章
tomcat run log
查看>>
[转载].(筆記) Qsys resource整理 (SOC) (Nios II) (Qsys)
查看>>
【洛谷日报#75】浅谈C++指针
查看>>
Spring @Transactional propagation 各个属性值的含义
查看>>
知乎背景图 canvas 效果
查看>>
Vncserver安装-Centos7
查看>>
div自身高度、屏幕高度
查看>>
HDU 1358 Period(kmp简单解决)
查看>>
PYTHON压平嵌套列表
查看>>
JavaScript -- BATweb笔试面试
查看>>
halcon算子翻译——compose7
查看>>
关于angular 自定义directive
查看>>
第五章 Python 函数(一)
查看>>
无聊的数列 线段树差分
查看>>
Dart: path库
查看>>
uva 10739【基础(区间)dp】
查看>>
PHP json_encode() 函数介绍
查看>>
武汉科技大学ACM :1009: 华科版C语言程序设计教程(第二版)习题6.11
查看>>
判断是否为时间格式
查看>>
电影池子,
查看>>