日期:2014-05-18  浏览次数:21163 次

请教正则表达式的Groups属性,剪不断,理还乱
Match类:http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.match(v=vs.110).aspx
Groups属性:获取由正则表达式匹配的组的集合。属性值为GroupCollection类型。
我们知道,正则表达式分组中,是以"()"进行分组的,编号为0的组表示整个表达式匹配的内容


例子1:
string s = "百位邻期";
string regx = "(.*)";
Match match = Regex.Match(s, regx);
Console.WriteLine(match.Groups[0].Value);
Console.WriteLine(match.Groups[1].Value);
Console.ReadKey();

上面Groups[0]和Groups[1]输出结果均为:百位邻期



例子2:
string s = "百位邻期";
string regx = "(.*)刘德华|(.*)";
Match match = Regex.Match(s, regx);
Console.WriteLine(match.Groups[0].Value);
Console.WriteLine(match.Groups[1].Value); //为什么是空
Console.ReadKey();


上面正则表达式,“|”左边的表达式显然是不能匹配的,只有“|”右边的表达式才匹配,可是输出的时候,为什么Groups[1]输出为空呢,和例子1不是一样的吗?

请大师指教,谢谢!!!

------解决方案--------------------
给你分析一下,
(.*)刘德华|(.*)

$0:就是匹配到整个“百位邻期”
$1(第一个分组):就是红色部分,由于未匹配到,所有为捕获到,所以为空
$2(第二个分组):就是蓝色部分,匹配到“百位邻期”

所以第一个分组没匹配到,第二个分组为“百位邻期”
------解决方案--------------------
(.*)刘德华|(.*)

即匹配(.*)刘德华,或者(.*)

(.*)刘德华 显然不匹配,所以刘德华左边的捕获组(.*)为空,即Group[1].Value为空
------解决方案--------------------
http://topic.csdn.net/u/20120528/19/b7fd54ab-5524-4724-b6fb-833b2baa5e0f.html
------解决方案--------------------
首先你要清楚捕获组的编号规则,可以参考
正则基础之——捕获组(capture group)

C# code
string s = "百位邻期";
Regex reg = new Regex(@"(.*)刘德华|(.*)");
Match m = reg.Match(s);
richTextBox2.Text = "捕获组数量:" + reg.GetGroupNumbers().Length + "\n";
for (int i = 0; i < reg.GetGroupNumbers().Length; i++)
{
    richTextBox2.Text += "捕获组 " + i + " 捕获内容:" + m.Groups[i].Value + "\n";
}
/*-----输出-----
捕获组数量:3
捕获组 0 捕获内容:百位邻期
捕获组 1 捕获内容:
捕获组 2 捕获内容:百位邻期
*/

------解决方案--------------------
Regex reg = new Regex(@"(.*)刘德华|(百)");
试试。