(转)正则表达之零宽断言(零宽度正预测先行断言)
原文地址: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
(转)正则表达之零宽断言(零宽度正预测先行断言)相关推荐
- 零宽断言java_正则表达之零宽断言(零宽度正预测先行断言)
最近为了对html文件进行源码处理,需要进行正则查找并替换.于是借着这个机会把正则系统地学一下,虽然以前也用过正则,但每次都是临时学一下混过关的.在学习的过程中还是遇到不少问题的,特别是零宽断言(这里 ...
- regex 正则表达式零宽度正预测先行断言 and 零宽度正回顾后发断言
http://www.cnblogs.com/creek/archive/2009/04/04/1429600.html msdn中的描述如下: (?= 子表达式) (零宽度正预测先行断言.) 仅当子 ...
- android零宽空格,零宽字符文本水印原理
最近看到word-wrap源码里面有一个正则,有点迷惑:if (options.cut !== true) { regexString += '([\\s\u200B]+|$)|[^\\s\u200B ...
- Regex 正则零宽断言
http://baike.baidu.com/link?url=sLfovpZmIcS5Uz_tiidXoVtjl30Tu3wARMfhnEcbgEGzsb8g1z7dvtGNXTulu1KDodmi ...
- 正则表达式零宽断言详解
在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了. 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存 ...
- 正则表达式之零宽断言
介绍: 零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< \> 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言), ...
- php 零宽断言,正则表达式之零宽断言
介绍: 零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< \> 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言), ...
- 【正则表达式系列】零宽断言
一:基本概念 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已. 二:用法 1:(?=exp):零宽度正预测先行断言,它断言自身出现的位 ...
- $python正则表达式系列(5)——零宽断言
本文主要总结了python正则零宽断言(zero-length-assertion)的一些常用用法. 1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面 ...
- python re零宽断言踩坑 re.error: look-behind requires fixed-width pattern
python re零宽断言踩坑 在在线的正则校验工具上写了大半天才写出来的表达式,往python里一粘贴复制,代码行飘红,强行运行之后,报错. 表达式: #用单引号替换txt_line中匹配到的双引号 ...
最新文章
- 吃瓜腾讯平均月薪7.27万后,微信又出大招
- 美国光伏发电市场是否稳定?电池板价格降至40美分/W!
- cookie 记住浏览历史
- golang map 排序 key value
- Java多线程--synchronized修饰普通方法和修饰静态方法的区别
- Linux-2.6.20的cs8900驱动分析
- 2020年十月下旬,再次更新了自己的linkedin工作经历
- OllyDBG反汇编快速找到程序入口一点分析
- 文科生必备计算机知识点,文科生计算机知识点调查报告.docx
- Thread 类的属性和方法
- 清华大学电机学答案_电机学清华大学答案
- TVS瞬变抑制二极管选型表
- 长江大学计算机科学学院德贵奖学金,关于做好2019年各类奖学金评选的通知
- 深度装N卡LINUX驱动 性能怎么样,讲解Deepin 20开源Nouveau和闭源NVIDIA驱动,附装闭源N卡驱动的方法...
- 如何将电脑中的文件彻底清除干净
- zephyr如何添加pwm支持
- 一文读懂Apache Kylin
- Mysql相关操作与命令
- c语言的标识符可分为哪3种字符,c语言标识符有哪三类?
- 使用rufus制作Windows Server 2012 R2 U盘_wentfar·tsao