[.net]正则表达式整理(转)
正则表达式在处理字符串方面具有强大的优势,所以整理了一下主要的知识点,希望对大家有所帮助。通过这篇文章我们能够理清Match,Group,Capture的区别和联系。(如果您已经清楚,则没有读下去的必要了:p)
.net下正则表达式处于System.Text.RegularExpression 命名空间下,主要由几个类构成:Regex,Match,Group,Capture。
Regex表示只读的正则表达式类,它包含很多静态方法用于匹配,是我们调用正则表达式的起点。Match方法的介绍留到后面,这里先介绍一下Regex.Replace方法,应用该方法可以快捷的替换字符串。该方法有多个重载的列表,其中比较常用的有2个,一个是 Replace(string, string, string),最后一个string可以用"$1,2"等来表示用捕获的分组替换原来的字符串,例如string s = Regex.Replace(" abra ddd ", @"^\s*(.*?)\s(.*?)\s*$", "$2");则返回的是该输入的第二个分组的内容"ddd",关于分组看下面的match介绍。还有一个是Replace(string,MatchEvaluator),其中MatchEvaluator是一个签名为string (Match)的委托,那么我们就可以通过定义一个委托方法,来处理返回字符串。
Match表示匹配操作的结果。它返回通过正则表达式在输入串中匹配到的第一个结果。例如以abc(正则)匹配123abc456abc(输入),则会得到2个Match。所以我们直接调用Regex r = new Regex("abc");Match m = r.Match("123abc456abc");则返回的m只有第一个abc,所以如果我们想得到第一个匹配时可以调用一次Match就可以了。如果我们想遍历所有的匹配,则需要使用Matches方法返回MatchCollection来遍历,或者用Match方法做一个循环。例如MatchCollection mathes =r.Matches(……);或者while(m.Success){……;m = m.NextMatch();}
当然我们不会只写这么简单的正则表达式,很多时候需要做一些分组来方便字符串的处理,这就用到了Group和GroupCollection。我们在用正则表达式进行匹配时,始终默认整个正则表达式作为第一个分组(Group),例如"a((b)c)",就包含3个Group:abc,bc,b(从左至右),这3个Group构成了这个Match的GroupCollection。由于正则表达式的元字符的原因,每个Group又可能包含若干个捕获(Capture),例如用"(abc)+"匹配"abcabcabcddd"时,就得到2个Group,第一个是默认的整个正则表达式匹配的分组(abcabcabc),由于整个表达式默认执行的是贪婪匹配,所以匹配了最多可能的abc串,所以这个group只有一个capture。第二个Group是用分组"(abc)+"来捕获的,由于存在3个abc所以他捕获了3个Capture,分别为3个abc。直接访问Group.Value,返回的则是该组最后一个Capture的值。
举例:通过这个例子可以熟悉怎么读取匹配的结果。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
Regex r = new Regex("(Abc)+");
Match m = r.Match("XYZAbcAbcAbcXYZAbcAb");
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//输出分组的个数
Console.WriteLine("Captured groups = " + m.Groups.Count.ToString());
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 在分组中循环
for (int i = 0; i < m.Groups.Count; i++)
{
CaptureCollection cc = m.Groups[i].Captures;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 输出当前分组捕获的个数
Console.WriteLine("Captures count = " + cc.Count.ToString());
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// 在捕获中循环
for (int ii = 0; ii < cc.Count; ii++)
{
// 输出捕获的位置
Console.WriteLine(cc[ii] + " Starts at character " + cc[ii].Index);
}
}
将会产生如下输出:
Captured groups = 2
Captures count = 1
AbcAbcAbc Starts at character 3
Captures count = 3
Abc Starts at character 3
Abc Starts at character 6
Abc Starts at character 9
附录:
正则表达式测试工具:http://regulator.sourceforge.net/
关于正则表达式的写法:http://www.cnblogs.com/mancini/archive/2005/03/21/122819.html
.net下正则表达式处于System.Text.RegularExpression 命名空间下,主要由几个类构成:Regex,Match,Group,Capture。
Regex表示只读的正则表达式类,它包含很多静态方法用于匹配,是我们调用正则表达式的起点。Match方法的介绍留到后面,这里先介绍一下Regex.Replace方法,应用该方法可以快捷的替换字符串。该方法有多个重载的列表,其中比较常用的有2个,一个是 Replace(string, string, string),最后一个string可以用"$1,2"等来表示用捕获的分组替换原来的字符串,例如string s = Regex.Replace(" abra ddd ", @"^\s*(.*?)\s(.*?)\s*$", "$2");则返回的是该输入的第二个分组的内容"ddd",关于分组看下面的match介绍。还有一个是Replace(string,MatchEvaluator),其中MatchEvaluator是一个签名为string (Match)的委托,那么我们就可以通过定义一个委托方法,来处理返回字符串。
Match表示匹配操作的结果。它返回通过正则表达式在输入串中匹配到的第一个结果。例如以abc(正则)匹配123abc456abc(输入),则会得到2个Match。所以我们直接调用Regex r = new Regex("abc");Match m = r.Match("123abc456abc");则返回的m只有第一个abc,所以如果我们想得到第一个匹配时可以调用一次Match就可以了。如果我们想遍历所有的匹配,则需要使用Matches方法返回MatchCollection来遍历,或者用Match方法做一个循环。例如MatchCollection mathes =r.Matches(……);或者while(m.Success){……;m = m.NextMatch();}
当然我们不会只写这么简单的正则表达式,很多时候需要做一些分组来方便字符串的处理,这就用到了Group和GroupCollection。我们在用正则表达式进行匹配时,始终默认整个正则表达式作为第一个分组(Group),例如"a((b)c)",就包含3个Group:abc,bc,b(从左至右),这3个Group构成了这个Match的GroupCollection。由于正则表达式的元字符的原因,每个Group又可能包含若干个捕获(Capture),例如用"(abc)+"匹配"abcabcabcddd"时,就得到2个Group,第一个是默认的整个正则表达式匹配的分组(abcabcabc),由于整个表达式默认执行的是贪婪匹配,所以匹配了最多可能的abc串,所以这个group只有一个capture。第二个Group是用分组"(abc)+"来捕获的,由于存在3个abc所以他捕获了3个Capture,分别为3个abc。直接访问Group.Value,返回的则是该组最后一个Capture的值。
举例:通过这个例子可以熟悉怎么读取匹配的结果。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
将会产生如下输出:
Captured groups = 2
Captures count = 1
AbcAbcAbc Starts at character 3
Captures count = 3
Abc Starts at character 3
Abc Starts at character 6
Abc Starts at character 9
附录:
正则表达式测试工具:http://regulator.sourceforge.net/
关于正则表达式的写法:http://www.cnblogs.com/mancini/archive/2005/03/21/122819.html