实例详解C#正则表达式

2019-12-30 11:32:37丽君

(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)贪婪与非贪婪

正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。请看以下示例: