zoukankan      html  css  js  c++  java
  • (转)正则表达之零宽断言(零宽度正预测先行断言)

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

  • 相关阅读:
    [转]对Lucene PhraseQuery的slop的理解
    Best jQuery Plugins of 2010
    15 jQuery Plugins To Create A User Friendly Tooltip
    Lucene:基于Java的全文检索引擎简介
    9 Powerful jQuery File Upload Plugins
    Coding Best Practices Using DateTime in the .NET Framework
    Best Image Croppers ready to use for web developers
    28 jQuery Zoom Plugins Creating Stunning Image Effect
    VS2005 + VSS2005 实现团队开发、源代码管理、版本控制(转)
    禁止状态栏显示超链
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2909309.html
Copyright © 2011-2022 走看看