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


    最近为了对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了。

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

         答案是:2881064151a(?=b)bc

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

    补充三

    (?=exp):零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。

    #匹配后面为_path,结果为product
      'product_path'.scan /(product)(?=_path)/

    (?<=exp):零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp

    #匹配前面为name:,结果为wangfei
    'name:wangfei'.scan /(?<=name:)(wangfei)/ #wangfei

    (?!exp):零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。

    #匹配后面不是_path
    'product_path'.scan /(product)(?!_path)/  #nil
    #匹配后面不是_url
    'product_path'.scan /(product)(?!_url)/  #product

    (?<!exp):零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp

    #匹配前面不是name:
    'name:angelica'.scan /(?<!name:)(angelica)/  #nil
    #匹配前面不是nick_name:
    'name:angelica'.scan /(?<!nick_name:)(angelica)/#angelica

  • 相关阅读:
    请注意更新TensorFlow 2.0的旧代码
    tf.cast用法
    文件句柄
    Python学习(四)cPickle的用法
    机器都会学习了,你的神经网络还跑不动?来看看这些建议
    Hadoop集群管理之配置文件
    SQL之case when then用法
    关于2014
    Oracle之虚拟索引
    Linux之Ganglia源码安装
  • 原文地址:https://www.cnblogs.com/cbryge/p/6088600.html
Copyright © 2020-2023  润新知