(6)特殊字符的匹配
下面提供一些简单的示例:
(7)组与非捕获组
以下提供一些简单的示例:
string x = "Live for nothing,die for something";
string y = "Live for nothing,die for somebody";
Regex r = new Regex(@"^Live ([a-z]{}) no([a-z]{}),die / some/$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//
Console.WriteLine("y match count:" + r.Matches(y).Count);//
//正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用
表达式中的“/”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“/”则依此类推。
string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no([a-z]{}),die for some/$");
if (r.IsMatch(x))
{
Console.WriteLine("group value:" + r.Match(x).Groups[].Value);//输出:thing
}
//获取组中的内容。注意,此处是Groups[],因为Groups[]是整个匹配的字符串,即整个变量x的内容。
// http://www.easck.com/sosoft/
string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no(?<g>[a-z]{}),die for some/$");
if (r.IsMatch(x))
{
Console.WriteLine("group value:" + r.Match(x).Groups["g"].Value);//输出:thing
}
//可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)。
string x = "Live for nothing nothing";
Regex r = new Regex(@"([a-z]+) /");
if (r.IsMatch(x))
{
x = r.Replace(x, "$");
Console.WriteLine("var x:" + x);//输出:Live for nothing
}
//删除原字符串中重复出现的“nothing”。在表达式之外,使用“$”来引用第一个组,下面则是通过组名来引用:
string x = "Live for nothing nothing";
Regex r = new Regex(@"(?<g>[a-z]+) /");
if (r.IsMatch(x))
{
x = r.Replace(x, "${g}");
Console.WriteLine("var x:" + x);//输出:Live for nothing
}
string x = "Live for nothing";
Regex r = new Regex(@"^Live for no(?:[a-z]{})$");
if (r.IsMatch(x))
{
Console.WriteLine("group value:" + r.Match(x).Groups[].Value);//输出:(空)
}
//在组前加上“?:”表示这是个“非捕获组”,即引擎将不保存该组的内容
(8)贪婪与非贪婪
正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。请看以下示例:










