关闭

正则表达之零宽断言(零宽度正预测先行断言)

标签: 正则
590人阅读 评论(0) 收藏 举报
分类:

正则表达之零宽断言(零宽度正预测先行断言)

      最近为了对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就匹配上了,还要这么折腾吗?当然不用这么折腾,只是为了说明零宽度正预测先行断言到底是怎么一回事?关于其它的零宽断言也是同一原理!

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java正则表达式 预搜索(零宽断言)详解(精)

查看原文:http://ibloger.net/article/31.html零宽断言的意思是(匹配宽度为零,满足一定的条件/断言) 我也不知道这个词语是那个王八蛋发明的,简直是太拗口了。 零宽断言用...
  • xiaokui_wingfly
  • xiaokui_wingfly
  • 2016-07-21 17:22
  • 2602

正则表达式之零宽断言详解

什么是零宽断言;正向先行断言;反向先行断言;正向后发断言;反向后发断言;
  • hsd2012
  • hsd2012
  • 2016-04-28 11:16
  • 4188

教你怎么理解正则表达式之零宽断言(环视)

思考题 今天有人问一个关于零宽断言的正则: var reg = /(?=a)b/; reg.exec("ab"); 大家思考下这个正则为什么匹配不了?我们先了解一下什么叫零宽断言,最后再来回答这个问...
  • binjly
  • binjly
  • 2013-09-29 13:23
  • 2827

[数据结构与算法]模式匹配与文本处理-零宽度正预测先行断言 and 零宽度正回顾后发断言

msdn中的描述如下:(?= 子表达式)(零宽度正预测先行断言。) 仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。(?(...
  • david_520042
  • david_520042
  • 2016-09-23 08:39
  • 462

正则的零宽度断言

零宽断言地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……接下来的四个用于查找在某些内容(但并...
  • liuchongming
  • liuchongming
  • 2011-06-02 13:49
  • 883

Java - 正则表达式的先行断言和后行断言

感谢原作者 正则表达式的先行断言和后行断言一共有4种形式: (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) (?!...
  • yb642518034
  • yb642518034
  • 2017-03-10 16:13
  • 535

正则表达式的先行断言(lookahead)和后行断言(lookbehind)

正则表达式的先行断言和后行断言一共有4种形式:  (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) 匹配到后面pattern...
  • u013433821
  • u013433821
  • 2017-11-05 20:06
  • 67

正则表达式的先行断言(lookahead)和后行断言(lookbehind)

正则表达式的先行断言和后行断言一共有4种形式:(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)(?!pattern) 零宽负向...
  • hudie1234567
  • hudie1234567
  • 2011-07-28 21:10
  • 5078

关于正则表达式的先行断言(lookahead)和后行断言(lookbehind)的理解

正则表达式的先行断言和后行断言一共有4种形式:  (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)  (?!pattern...
  • ianlyianly
  • ianlyianly
  • 2014-05-31 23:34
  • 374

正则表达式的先行断言(lookahead)和后行断言(lookbehind)

正则表达式的先行断言和后行断言一共有4种形式:  (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)  (?!pattern...
  • afeiqiang
  • afeiqiang
  • 2016-04-14 20:03
  • 987
    文章分类
    最新评论