天天看点

正则表达式零宽断言

零宽断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言)。

分类 代码/语法 说明
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置

比如,来查找xxxx表达式所匹配字符串,使用零宽断言时,可单独可组合,以下是组合写法,便于记忆。

(?<=exp)xxxx(?=exp)

(?<!exp)xxxx(?!exp)

一.零宽度正预测先行断言(?=exp)

xxxx(?=exp)  解释为:匹配exp前面的xxxx

static void Main(string[] args)
        {
            string str = "watch watching watched watches";
            //匹配ing前面的watch
            string myregex = @"watch(?=ing)";
            //输出6,说明匹配的是watching中的watch         
            Regex.Matches(str, myregex).Cast<Match>().Select(m => m.Index).ToList<int>().ForEach(r => Console.WriteLine(r));
        }
           
正则表达式零宽断言

二.零宽度正回顾后发断言(?<=exp)

(?<=exp)xxxx  解释为:匹配exp后面的xxxx

static void Main(string[] args)
        {
            string str = "Hi man Hi woman Hello superman";
            //匹配wo后面的man
            string myregex = @"(?<=wo)man";
            //输出12,说明匹配的是woman中的man         
            Regex.Matches(str, myregex).Cast<Match>().Select(m => m.Index).ToList<int>().ForEach(r => Console.WriteLine(r));
        }
           
正则表达式零宽断言

三.零宽度负预测先行断言(?!exp)

xxxx(?!exp)  解释为:匹配xxxx,但此xxxx后面跟的不是exp

static void Main(string[] args)
        {
            string str = "watch watching watched watches";
            //匹配后面跟的不是ing的watch
            string myregex = @"watch(?!ing)";
            //输出0,15,23,说明匹配的是watch、watched、watches中的watch        
            Regex.Matches(str, myregex).Cast<Match>().Select(m => m.Index).ToList<int>().ForEach(r => Console.WriteLine(r));
        }
           
正则表达式零宽断言

四.零宽度负回顾后发断言(?<!exp)

(?<!exp)xxxx  解释为:匹配xxxx,但此xxxx前面不是exp

static void Main(string[] args)
        {
            string str = "Hi man Hi woman Hello superman";
            //匹配前面不是wo的man
            string myregex = @"(?<!wo)man";
            //输出3,27,说明匹配的是man、superman中的man         
            Regex.Matches(str, myregex).Cast<Match>().Select(m => m.Index).ToList<int>().ForEach(r => Console.WriteLine(r));
        }
           
正则表达式零宽断言