正则表达之零宽断言(零宽度正预测先行断言)
正则表达之零宽断言(零宽度正预测先行断言)最近为了对html文件进行源码处理,需要进行正则查找并替换。于是借着这个机会把正则系统地学一下,虽然以前也用过正则,但每次都是临时学一下混过关的。在学习的过程中还是遇到不少问题的,特别是零宽断言(这里还要吐槽下,网上到处都是都复制粘贴的内容,遇到个问题查看了不少重复的东西,汗!!!),所以在这里把自己的理解写下来,方便以后查阅! 零宽度正预测先行断言是什么呢,看msdn上的官方解释定义
经典的例子:某单词以ing结尾,要获取ing前面的内容 var reg = new Regex(@"w+(?=ing)"); var str = "muing"; Console.WriteLine(reg.Match(str).Value);//返回mu 以上是网上到处可见的例子,到这里或许你明白了,原来就是返回了exp表达式前面的内容。 再看下面的的代码 a(?=b)cabc";
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就匹配上了,还要这么折腾吗?当然不用这么折腾,只是为了说明零宽度正预测先行断言到底是怎么一回事?关于其它的零宽断言也是同一原理! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Oracle-The Java Tutorials
- c# – 如何多线程“跨层”具有相关ID的单例而不锁
- Add comments to a regular expression (为正则表
- ruby-on-rails – 删除Gem中指定的路由?
- ListView实例-直接通过XML文件进行…
- ruby – class vs Class.new,module vs Module.n
- ruby – 我如何有条件地跳过Cucumber中的场景?
- 体验TinyXML读写XML文件数据
- 指针 – Swift中String的UnsafeMutablePointer
- c# – 如何将带图像的段落添加到iTextSharp表格中