1. 程式人生 > >正則表示式零寬斷言

正則表示式零寬斷言


零寬斷言:用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\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));
        }