特殊构造(非捕获总结)

参考:http://blog.chenlb.com/2008/12/java-regular-expression-special-constructs-ornon-capturing-group.html

在 java api 文档中的正则表达式关于特殊构造(非捕获组)的说明看不懂。例如:

(?:X)X,作为非捕获组
(?idmsux-idmsux)Nothing,但是将匹配标志由 on 转为 off
(?idmsux-idmsux:X)X,作为带有给定标志 on - off 的非捕获组
(?=X)X,通过零宽度的正 lookahead
(?!X)X,通过零宽度的负 lookahead
(?<=X)X,通过零宽度的正 lookbehind
(?<!X)X,通过零宽度的负 lookbehind
(?>X)X,作为独立的非捕获组

这些字都说的很抽象。不懂……。还是搜索下去。找到 火龙果 的解释如下:

以 (? 开头,) 结尾的都称为非捕获组,在匹配完成后在内存中不保留匹配到的字符。

非捕获组的应用比较复杂,这里只能简单地说一下它们的意思。

1、(?:X) X,作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,仅仅作为分组。
比如:

要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配123 后会保留在内存中,便于反向引用;

(?:123) 在匹配完后则不会保留反向引用,区别仅在于此。不保留反向引用可以节省内存,提高效率。

(123)\1等效(?:123)123,代码示例:

 /*** outputs* 模式(123)\1* 123123*/Pattern p = Pattern.compile("(123)\\1");Matcher m = p.matcher("ad123dfe123123grr");System.out.println("模式(123)\\1");while(m.find()){System.out.println(m.group());}/*** outputs* 模式(?:123)123* 123123*/p = Pattern.compile("(?:123)123");m = p.matcher("ad123dfe123123grr");System.out.println("模式(?:123)123");while(m.find()){System.out.println(m.group());}

2、(?idmsux-idmsux)  Nothing,但是将匹配标志i d m s u x on - off
用于标志匹配,比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配
不区分大小地进行匹配,(?-i) 关闭标志,恢复不区分大小写,这时的 def 只能匹配 def

//(?i)忽略大小写,这个简单。但是只适合ASCII字符//当有俄文字符——小写б(大写Б)л(Л),这时要一起用(?u)p = Pattern.compile("(?i)(?u)sayбл");m = p.matcher("This is a test sayбл hello.\n"+"Wello SayБЛ \nello?");System.out.println("参数为(?i)(?u)");while(m.find()){System.out.println(m.group());}
//单行模式下,.可以匹配任何字符(包括\n)/*** outputs* hello* Wello* \nello*/p = Pattern.compile("(?s).ello");m = p.matcher("This is a test say hello.\n"+ "Wello say \nello?");System.out.println("参数为(?s)");while(m.find()){System.out.println(m.group());}
 //多行模式下,\n 或\r\n 作为行的分隔符,不匹配(.)/*** outputs:* hello* Wello*/p = Pattern.compile("(?m).ello");m = p.matcher("This is a test say hello.\n"+ "Wello say \nello?");System.out.println("参数为(?m)");while(m.find()){System.out.println(m.group());}


   //(?d)模式,启动UNIX行模式,只认 \n//UNIX 行: \n//WINDOWS 行:\r\n/*** outputs:* ello start:27end:32* ello?start:37end:42*/p = Pattern.compile("(?m)ello.");m = p.matcher("This is a test say hello\r\n"+"Wello say \nello?");System.out.println("参数为(?d)");while(m.find()){System.out.println( m.group() + "start:" + m.start() + "end:" + m.end() );}//单独使用(?m)能依据\n 和\r\n 来分行/*** outputs:* ello* start:20end:25* ello start:27end:32* ello?start:37end:42*/p = Pattern.compile("(?d)(?m)ello.");m = p.matcher("This is a test say hello\r\n"+"Wello say \nello?");System.out.println("参数为(?d)");while(m.find()){System.out.println( m.group() + "start:" + m.start() + "end:" + m.end() );}//组合使用(?d)(?m)只能依据\n 来分行


3、(?idmsux-idmsux:X)  X,作为带有给定标志 i d m s u x on - off
与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)

4、(?=X) X,通过零宽度的正 lookahead
5、(?!X) X,通过零宽度的负 lookahead

(?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为
ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。
(?!X) 表示当前位置后面不允许出现的字符

字符扫描,从左到右,所以前瞻即向右看后瞻即向左看

 //a(?=b),匹配a前瞻(lookahead)是b;即ab但不捕获b/*** outputs* a:start=4,end=5* a:start=9,end=10*/p = Pattern.compile("a(?=b)");m = p.matcher("aacdabaaeabdaBh");System.out.println("a(?=b)");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}
//a(?!b),匹配a前瞻(lookahead)是非b;即a[^b]但不捕获[^b]/*** outputs* a:start=0,end=1* a:start=1,end=2* a:start=6,end=7* a:start=7,end=8* a:start=12,end=13*/p = Pattern.compile("a(?!b)");m = p.matcher("aacdabaaeabdaBh");System.out.println("a(?!b)");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}

6、(? <=X) X,通过零宽度的正 lookbehind
7、(? <!X) X,通过零宽度的负 lookbehind

这两个与上面两个类似,上面两个是向后看,这个是向前看

//(?<=b)a,匹配a后瞻(lookbehind)是b;即ba但不捕获b/*** outputs* a:start=6,end=7*/p = Pattern.compile("(?<=b)a");m = p.matcher("aacdabaaeabdaBh");System.out.println("(?<=b)a");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}
//(?<!b)a,匹配a后瞻(lookbehind)是非b;即[^b]a但不捕获[^b]/*** outputs* a:start=0,end=1* a:start=1,end=2* a:start=4,end=5* a:start=7,end=8* a:start=9,end=10* a:start=12,end=13*/p = Pattern.compile("(?<!b)a");m = p.matcher("aacdabaaeabdaBh");System.out.println("(?<!b)a");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}

8、(?>X) X,作为独立的非捕获组
匹配成功不进行回溯,这个比较复杂,也侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。

//(?>x)不回溯的匹配,性能优化/*** outputs* integer:start=5,end=12* insert:start=17,end=23* in:start=27,end=29*/p = Pattern.compile("\\b(?>integer|insert|in)\\b");m = p.matcher("test integer and insert of in it");System.out.println("\\b(?>integer|insert|in)\\b");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}
// 换了个顺序,结果大不一样!
/*** outputs* in:start=27,end=29*/p = Pattern.compile("\\b(?>in|integer|insert)\\b");m = p.matcher("test integer and insert of in it");System.out.println("\\b(?>in|integer|insert)\\b");while(m.find()){System.out.println(m.group() + ":start=" + m.start() + ",end=" + m.end());}

还没搞懂,为什么换个顺序后结果就不同了,反正别人建议是:长的放前面,短的放后面。至于原因嘛,以后懂了再说。












本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

佳能g2810打印机扫描怎么用_办公用这款佳能彩色激光打印机无线MF643CDW就够了!...

佳能MF643CDW彩色三合一激光打印https://www.zhihu.com/video/1195286618850979840近两年来&#xff0c;激光打印机正以惊人的速度在办公室、商业用户中普及开来。新一代的彩色激光打印机正以其前所未有的低价位开始大规模进入主流办公室&#xff0c;越来越多的用户将在办公室中…

史上最完整的人工智能书单大全,学习AI的请收藏好

来源&#xff1a; 产业智能官 概要&#xff1a;想自学人工智能&#xff0c;到底看什么书&#xff1f;现在关于AI的图书成千上万&#xff0c;那些才是最好的&#xff1f; 想自学人工智能&#xff0c;到底看什么书&#xff1f;现在关于AI的图书成千上万&#xff0c;那些才是最好…

Cocos creator构建web-moblie 封装到android启动

Cocos creator构建web-moblie 封装到android studio中启动 构建的版本采用 使用21 api版本 5.0 可能的问题&#xff1a;影响到其它事件功能的无非实现 *如果 请升级语法 本次构造和启动为 远程url的形式加载启动 activity_main.xml <?xml version"1.0" encodin…

pcb布线拐角处打地孔_PCB线路板布线的10个重要规则——公众号【深圳LED网】

PCB布线&#xff0c;即铺设通电信号的道路以连接各个器件&#xff0c;这好比通过修路来连接各个城市通车。在PCB设计中&#xff0c;布线是完成产品设计的重要步骤&#xff0c;同时也是技巧最细、限定最高的步骤&#xff0c;甚至有经验的工程师也对布线颇为头疼。以下是PCB布线的…

SplitConcatWithAMP----Array转换为String,连接;String转换为Array,切割

SplitConcatWithAMP 功能描述&#xff1a; 1、将字符串数组连接为整个字符串&#xff0c;& 为连接符 特例&#xff1a;如果 array 为 null 或 empty&#xff0c;抛出异常。因为这时无法转换&#xff01; public static String arrayToStringWithAMP( String[] array ) …

低调的苹果罕见发表论文,揭开自动驾驶汽车技术的冰山一角

来源&#xff1a;华尔街见闻 概要&#xff1a;在自动驾驶领域低调又低调的苹果终于发声了。近日&#xff0c;苹果研究人员颇为罕见地公布了一份关于自动驾驶技术的论文。 在自动驾驶领域低调又低调的苹果终于发声了。近日&#xff0c;苹果研究人员颇为罕见地公布了一份关于自动…

恐惧、野心和迷茫,机器人公民背后的未来世界

作者&#xff1a; 刘锋 计算机博士 互联网进化论作者 当时间的车轮到达2017年10月&#xff0c;人工智能领域陆续爆发很多重要事件。 其中最吸引人们眼球的&#xff0c;当然仍属学会了自我学习的AlphaGo zero和沙特阿拉伯的机器公民索菲亚&#xff08;Sophia&#xff09;&am…

java设计一个bank类实现银行_AOS公链推出“隐私Bank”,彻底打破资产发行门槛!...

区块链技术从诞生到现在经历了无数的坎坷&#xff0c;一路走来虽然饱受争议&#xff0c;但是这个行业并没有停止发展的脚步&#xff0c;越来越多的落地项目正在改变我们的生活&#xff0c;尤其在公链领域&#xff0c;整个行业的生态建设更是程喷涌之势迅猛发展&#xff0c;今天…

JUnit4中使用Hamcrest测试框架的assertThat断言 小实例

我的项目中使用JUnit4.6待测试的方法//Get number from [p, r]int getRandomFrom(int p, int r){int chooes r-p1;return (int) Math.floor(Math.random() * chooes p);}第一步&#xff1a;引入类或static方法import static org.junit.Assert.*; import static org.hamcrest.…

2017年中国人工智能产业最全研究报告发布 | AI世界2018年八大趋势

来源&#xff1a; 数据观 概要&#xff1a;从目前来看&#xff0c;计算机视觉技术是人工智能的核心技术之一&#xff0c;广泛的商业化渠道和技术基础使其最为热门。 目前&#xff0c;中国的人工智能研究处于爆发期&#xff0c;行业巨头公司正逐渐完善自身在人工智能的产业链布局…

机器人暮色枪骑皮肤_吃鸡幸运新转盘:新载具皮肤和纸盒武器皮肤!

就在《和平精英》更新“罗小黑”系列皮肤的时候&#xff0c;国际服《Pubg Mobile》同样也没有闲着。与《和平精英》直售罗小黑皮肤不同的是&#xff0c;《Pubg Mobile》又上线了新的幸运转盘——Toy Power SPIN。机器人风格的幸运转盘来了&#xff0c;新载具皮肤、纸盒武器皮肤…

电脑常见毛病及治理

1、桌面快捷键阴影 我的电脑----属性----高级-----性能设置---在桌面上为图标标签使用阴影&#xff08;勾选&#xff09;OK 在桌面点右键---属性---自定义桌面---web 将网页里当前主页下面所有连接都删掉.-确定即可! 2、FTP 打开错误&#xff01; 打开如下两个服务&#xff1…

水泵怎么做_暖通空调|水泵出入口阀门及相关基础知识

设计过程中&#xff0c;经常看到或遇到一些设计人员对水泵前后的布置啥阀门或怎么布置阀门提出异议&#xff0c;现就对水泵前后的阀门及相关知识进行浅析&#xff0c;由于水平有限&#xff0c;有不对的地方欢迎指出。《通风与空调工程施工规范》(GB 50738-2011)第10.8.5条规定&…

未来智能实验室成立,建设世界第一个AI智商评测和趋势研究机构

来源&#xff1a;未来智能实验室 互联网云脑逐渐清晰&#xff0c;AI与互联网结合引发AI威胁论 从科学史可以看到这样一个规律&#xff1a;每一次人类社会的重大技术变革都会导致新领域的科学革命。互联网革命对于人类的影响已经远远超过了大工业革命。与工业革命增强人类的力量…

Eclipse相关

1、在Eclipse中查看JDK类库的源代码 &#xff08;原文&#xff1a;http://www.cnblogs.com/Quincy/archive/2011/06/17/2083378.html&#xff09; 设置&#xff1a; 1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES"…

echart 三维可视化地图_揭秘720°三维全景3D实景地图制作技术

近两年来三维全景3D实景地图在三维虚拟现实领域中占有相当大的地位。目前的三维720线上三维实景展示基本都是通过商迪3D三维全景建模与3d全景地图技术制作。例如&#xff1a;VR游戏、智慧城市规划项目、智慧房地产规划、智能地图、等项目都已3D实景地图技术为基础去开发制作。三…

IEEE发布人工智能伦理标准,确保人类不受影响

来源:专知 概要:机器人和自动系统将为社会带来重大创新。最近,公众越来越关注可能发生的社会问题,以及可能产生的巨大潜在利益。

Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法

1、equals 方法和hashCode 方法实现示例&#xff1a; public class EqualHashCodeTest {private boolean b;private int i;private float f;private double d;private String s;public EqualHashCodeTest() {super();}public EqualHashCodeTest(boolean b, int i, float f, dou…

走近“颠覆性技术”:量子通信能否取代传统通信?

来源&#xff1a;人民日报 概要&#xff1a;近些年来&#xff0c;量子通信技术的飞跃发展正让梦想成为现实。   制图&#xff1a;张芳曼 打个电话&#xff0c;会不会被窃听&#xff1f;通过网络传送一份保密文件&#xff0c;途中被他人窃取咋办……现代社会&#xff0c;信息…

oracle 行级死锁_解决Oracle数据库死锁

介绍本文我们尝试总结在多个用户并发情况下&#xff0c;如何识别和解决删除操作期间发生的死锁问题&#xff0c;在开始之前&#xff0c;我们先简单描述一下什么是死锁以及什么东西会导致死锁。死锁在任何数据库中发生死锁都是不愉快的&#xff0c;即使是在一个特殊的情况下发生…