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