java 正则(4) 不常用 / 贪婪匹配 / 非捕获组 / 向前引用 / flag 简写
来源:互联网 发布:e店宝软件打不开 编辑:程序博客网 时间:2024/06/05 21:56
1.以下用的不多,正则前三个内容已经够用,以下掌握不了也没关系,论坛上有人用,能看懂就行。
贪婪匹配 :Greedy ,用在数量词( 比如 * 之后加个问号,或者 {3,5} 这个后面加个问号 )之后,例如点星,就是贪婪匹配,点星问,就是非贪婪。也就是说,贪婪就是默认的
/ 非捕获组 :其中 ?= 用的算相对较多的
/ 向前引用 :用的极少 \\1 \\2 这种写法
/ flag 简写 : ? i 是CASE_INSENSITIVE 的简写
//之前的正则内容已经能够解决大部分问题,以下是额外的正则表达式内容,比较高级,qulifiers修饰符,限定符,是API 文档Pattern 中的 数量词/** * Greedy 数量词 ,即贪婪的数量词。默认的写法都是Greedy 数量词 * Reluctant 数量词,勉强,不情愿的数量词 * Possessive 数量词,占有欲,独占的数量词,用的非常少。这种就是挑最大的吞(这里是{3,10},故吞10个),不吐,所以效率高,追求效率的时候,用这种 * 以上三种有着非常细小的差别,Pattern 类里面有具体说明,这些都是量词,都跟在 + ? * 这种量词之后 */public static void greedyRegex(){//贪婪正则//测试 qulifiers,以下是Greedy,贪婪的System.out.println("---------higherRegex---------");Pattern p = Pattern.compile("(.{3,10})[0-9]");//0-10,注意这里不用()进行组控制,能实现贪婪,只是这样看得清楚。<span style="color:#ff0000;">这里的大括号{3,10}是量词</span>String s = "aaaa5bbbb6";//贪婪是,吃最多的,.{3,10}这个整体,先吃进去10个字符,发现整体不合适,[0,-9]这个数字不匹配,故吐出去一个6,Matcher m = p.matcher(s);//而后,匹配了,故出结果0-10if(m.find())System.out.println("Greedy is "+m.start()+"-"+m.end());elseSystem.out.println("not match");//以下是 reluctant,勉强的,不情愿的p = Pattern.compile("(.{3,10}?)[0-9]");//0-5s = "aaaa5bbbb6";//勉强的,不情愿的,是吃最少的,.{3,10}这个整体,先吃进去3个字符aaa,一看不合适,继续吃,迟到第4个,发现合适了,故出结果m = p.matcher(s);if(m.find())System.out.println("reluctant is "+m.start()+"-"+m.end());elseSystem.out.println("not match");//以下是 Possessive 1 p = Pattern.compile("(.{3,10}+)[0-9]");//not matchs = "aaaa5bbbb6";//这个和贪婪的有点类似,他上来全吞进去,但是不往外吐,吞进去后发现不匹配,因为字符串aaaa5bbbb6后面都没有东西了,所以m = p.matcher(s);//不匹配,if(m.find())System.out.println("reluctant is "+m.start()+"-"+m.end());elseSystem.out.println("not match");//以下是 Possessive 2p = Pattern.compile("(.{3,10}+)[0-9]");//0-11s = "aaaa5bbbb68";//一下子吞进10个即aaaa5bbbb6,此时后面是8,故字符串整体和正则匹配,所以返回0-11m = p.matcher(s);//if(m.find())System.out.println("reluctant is "+m.start()+"-"+m.end());elseSystem.out.println("not match");}//non-capturing groups 用的比较少,只有(?=a) 算是非捕获组用的多的,因为这种非捕获组的写法可以完全被别的替代,但是别人这么写用能读懂,perl 中常用public static void nonCapturingGroup(){System.out.println("----------nonCapturingGroup----------");Pattern p = Pattern.compile(".{3}(?=a)");//正常情况,小括号里面是个组,这个组用来匹配字符串,//但是此时,小括号里面以问号打头的,他不是用来匹配字符串的,所以他叫non capturing,不捕获字符串String s = "444a66b";//这叫非捕获组,意思是我抓三个字符加a结尾的字符串,但是我不捕获a,也就是只返回给三个字符,即结果是 444Matcher m = p.matcher(s);//如果写正则是 (?=a).{3},则打印a66,所以(?=a) 写前面和后面不一样,?=写前面是把a 算在结果之中,while(m.find()){//?=写后面是把a 不算在结果之中,所以他叫lookahead,从头开始看,尾巴上不算//System.out.println(m.group());}//////////////////以下非常不常用p = Pattern.compile("(?!=a).{3}");//意思是前面不能为a的,结果是444 66bp = Pattern.compile(".{3}(?!=a)");//意思是后面跟着的不是a, 结果是44a 66bp = Pattern.compile(".{3}(?<=a)");s = "444a66b";m = p.matcher(s);while(m.find()){System.out.println(m.group());//.{3}(?<!=a) 444,a66,意思是从后往前数不能是a的 .{3}(?<=a)是44a 从后往前数是a的 ,而且还包含a }}//back reference 向前引用,用的很少public static void backReference(){Pattern p = Pattern.compile("(\\d\\d\\1)");String s = "1212";//true , 向前引用,和第一组要能完全匹配,12和12完全一样,trueMatcher m = p.matcher(s);System.out.println(m.matches());p = Pattern.compile("(\\d(\\d)\\2)");//向前引用,和第二组要能完全匹配,2和前面第二组的2完全匹配,trues = "122";//true//flags 只有CASE_INSENSITIVE flag 常用,CASE_INSENSITIVE 简写为?i//Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);System.out.println("Java".matches("(?i)(java)"));//true 写法同上}
2. 一个贪婪的例子
代码为:
if(line.contains("/actity/srch")){
temp1 = line.split("200 OK");
temp2 = temp1[0].split(".*?:\\d{1,5}");//点星问,这种是reluctant 非贪婪,点星是默认写法,贪婪
//split 是用正则这个整体去分割字符串,整体不出现在字符串中
IPSetTemp.add(temp2[temp2.length-1].trim());
}
line 为:
#2016-03-09 00:00:00.860 /100.8.91.5:800/100.8.110.11:6044100.15.99.31200 OK4805 434POST false/actity/srch?requestFormat=xml&responseFormat=xmlHTTP/1.1Content-Type:application/x-www-form-urlencoded;Host:ws.activi.search.rirp.com;Content-Length:434;Expect:100-continue;Connection:Close;X-Forwarded-For:10.15.99.3;Netty-Client-IP:100.8.110.11;Content-Length:805;Content-Length-Bytes:805;Search
temp1 为:有两个
#2016-03-09 00:00:00.860 /100.8.91.5:800/100.8.110.11:6044100.15.99.31
4 805 434POSTfalse/actity/srch?requestFormat=xml&responseFormat=xmlHTTP/1.1Content-Type:application/x-www-form-urlencoded;Host:ws.activi.search.rirp.com;Content-Length:434;Expect:100-continue;Connection:Close;X-Forwarded-For:10.15.99.3;Netty-Client-IP:100.8.110.11;Content-Length:805;Content-Length-Bytes:805;Search-Total:329;Search
temp2 为:若被贪婪分 .*:\\d{1,5} 则为
"" 即空
10.15.99.3
temp2 若被reluctant 分 .*?:\\d{1,5} 则分成5个,则为
"" 即空
"" 即空
"" 即空
"" 即空
10.15.99.3
- java 正则(4) 不常用 / 贪婪匹配 / 非捕获组 / 向前引用 / flag 简写
- 正则表达式 捕获组,向前引用,零宽度断言,贪婪量词,惰性量词以及支配量词
- 正则表达式 捕获组,向前引用,零宽度断言,贪婪量词,惰性量词以及支配量词
- 正则表达式-贪婪与非贪婪匹配
- 正则表达式-贪婪与非贪婪匹配
- java 正则贪婪匹配
- 正则表达式的贪婪匹配(.*)和非贪婪匹配(.*?)
- 正则表达式的贪婪匹配和非贪婪匹配
- 正则表达式的贪婪匹配和非贪婪匹配
- python 正则表达式的贪婪匹配与非贪婪匹配
- 正则表达式中贪婪匹配和非贪婪匹配
- js正则表达式的贪婪匹配和非贪婪匹配
- java中正则匹配的贪婪模式和非贪婪模式
- VIM中正则的非贪婪匹配
- VIM中正则的非贪婪匹配
- java 正则表达式非贪婪
- 什么是正则表达式的贪婪与非贪婪匹配
- 正则表达式(一) 匹配原理/贪婪与非贪婪
- 数字信号处理A
- Java中使用MATLAB作图
- Orcale 12C 安装
- UI组件之TextView及其子类(三)ToggleButton和Switch
- modal 控制器的样式
- java 正则(4) 不常用 / 贪婪匹配 / 非捕获组 / 向前引用 / flag 简写
- 文章标题
- 菜鸟学习嵌入式 问题笔记之 关于-/bin/sh: 命令:not found的解决办法
- Android 实现沉浸式状态栏
- 27个提升效率的iOS开源库推荐
- Android studio中"ADB not responding."之处理
- 心情-似乎没有坚持下来
- DragonBones使用
- java代码中一些要注意的语法应用