零宽断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\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));
}