博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)正则表达之零宽断言(零宽度正预测先行断言)
阅读量:5104 次
发布时间:2019-06-13

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

原文地址:http://www.cnblogs.com/mu-mu/archive/2013/02/06/2893581.html

 

最近为了对html文件进行源码处理,需要进行正则查找并替换。于是借着这个机会把正则系统地学一下,虽然以前也用过正则,但每次都是临时学一下混过关的。在学习的过程中还是遇到不少问题的,特别是零宽断言(这里还要吐槽下,网上到处都是都复制粘贴的内容,遇到个问题查看了不少重复的东西,汗!!!),所以在这里把自己的理解写下来,方便以后查阅!

零宽度正预测先行断言是什么呢,看msdn上的官方解释定义

(?= 子表达式)

(零宽度正预测先行断言。)仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。

经典的例子:某单词以ing结尾,要获取ing前面的内容

var reg = new Regex(@"\w+(?=ing)");var str = "muing";Console.WriteLine(reg.Match(str).Value);//返回mu

以上是网上到处可见的例子,到这里或许你明白了,原来就是返回了exp表达式前面的内容。

再看下面的的代码

var reg = new Regex(@"a(?=b)c");var str = "abc";Console.WriteLine(reg.IsMatch(str));//返回false

为什么会返回false?

其实msdn官方定义已经说了,只是它说得很官方而已。这里需要我们注意一个关键点:此位置。没错,是位置而不是字符。那么结合官方定义和第一个例子来理解第二个例子:

因为a后面是b,则此时返回了匹配内容a(由第一个例子知道,只返回a不返回exp匹配的内容),此时a(?=b)c中的a(?=b)部分已经解决了,接下来要解决c的匹配问题了,此时匹配c要从字符串abc哪里开始呢,结合官方定义,就知道是从子表达的位置向右开始的,那么就是从b的位置开始,但b又不匹配a(?=b)c剩余部分的c,所以abc就不匹配a(?=b)c了。

那么如果要上面的进行匹配,正则应该如何写呢?

答案是:a(?=b)bc

当然,有人会说直接abc就匹配上了,还要这么折腾吗?当然不用这么折腾,只是为了说明零宽度正预测先行断言到底是怎么一回事?关于其它的零宽断言也是同一原理!

转载于:https://www.cnblogs.com/fcsh820/archive/2013/02/08/2909309.html

你可能感兴趣的文章
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
IT项目经验和难点分享
查看>>
那些黑刘翔的人,你们的良心被狗吃了
查看>>
图片延迟加载(lazyload)的实现原理
查看>>
TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?...
查看>>
Eclipse.技巧
查看>>
Redis系列--内存淘汰机制(含单机版内存优化建议)
查看>>
去除DataTable重复数据的三种方法(转)
查看>>
手动导入第三方工程/类库
查看>>
tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
查看>>
【数据分析】Superset 之三 Docker操作管理
查看>>
HDU1260(KB12-H DP)
查看>>
安装mongodb
查看>>
context创建过程解析(一)之deployDescriptors
查看>>
Hibernate,JPA注解@ManyToMany_JoinTable
查看>>
Iris jwt 使用
查看>>
appium连接真机时,报错:error: device unauthorized.
查看>>
Uva 10004(二分图的判定)
查看>>
Codeforces Round #503 (by SIS, Div. 2)
查看>>