正则表达式分组的问题

Dic4000 2008-12-19 05:18:11
下面的正则表达式执行后为什么会有两个分组?

Match m = Regex.Match("xbracadabra", "(a|b|r)");//(a|b|r)+
Console.WriteLine("Group:");

foreach (Group g in m.Groups) Console.Write("{0}:{1} ",g.Value,g.Index );


结果为: Group:
b:1 b:1

不明白为什么会出现两个同样的b:1?
能否讲解一下C#中正则表达式是如何分组的?
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dic4000 2008-12-23
  • 打赏
  • 举报
回复
谢谢.我想我已经理解了他们之间的区别了.

wackyboy 2008-12-22
  • 打赏
  • 举报
回复
你的正则表达式是"(a|b|r)" ,可以这么理解 首先这是一个正则表达式 匹配整个符合规则的字符串,整个正则表达式还包含一个Group 所以还应该包含一个匹配这个组的结果
在你的结果中 Group[0]是匹配你这个整个的表达式的字符串,Group[1]才是你的表达式中的第一个组的字符串
例如正则"(a)c" 那么 Group[0] 为ac,Group[1]=a
Group[0]的值和Match的值是一样的 就是匹配整个正则的字符串
Dic4000 2008-12-22
  • 打赏
  • 举报
回复
顶下
菜子儿 2008-12-22
  • 打赏
  • 举报
回复
wa......来学习了。。。。
wackyboy 2008-12-22
  • 打赏
  • 举报
回复

Regex r = new Regex("(Abc)+");
string str = "XYZAbcAbcAbcXYZAbcAb";
MatchCollection mc = r.Matches(str);

Console.WriteLine("---------------------Group-------MatchCollection={0}\n", mc.Count);
for (int i = 0; i < mc.Count; i++)
{
Match mt = mc[i];
Console.WriteLine("Match[{0}] = {1}", i, mt.Value);
for (int j = 0; j < mt.Groups.Count; j++)
{
Group gc = mt.Groups[j];
Console.WriteLine(" Group[{0}] value is:{1}. Index is:{2}", j, gc.Value, gc.Index);
for (int k = 0; k < gc.Captures.Count; k++)
{
Capture gg = gc.Captures[k];
Console.WriteLine(" Capture[{0}] value is:{1}. Index is:{2}", k, gg.Value, gg.Index);
}
}
Console.WriteLine("-------Next Match-----");
}

Console.WriteLine("\n---------------------Capture-------MatchCollection={0}\n", mc.Count);
for (int i = 0; i < mc.Count; i++)
{
Match mt = mc[i];
Console.WriteLine("Match[{0}] = {1}", i, mt.Value);
for (int j = 0; j < mt.Captures.Count; j++)
{
Capture gc = mt.Captures[j];
Console.WriteLine(" Capture[{0}] value is:{1}. Index is:{2}", j, gc.Value, gc.Index);
}
Console.WriteLine("-------Next Match-----");
}

Match m = r.Match(str);
GroupCollection gcc = m.Groups;
Console.WriteLine("\n\n--------------------------------GroupCollection={0}", gcc.Count);
for (int i = 0; i < gcc.Count; i++)
{
Group gt = gcc[i];
CaptureCollection cc = gt.Captures;
for (int j = 0; j < gt.Captures.Count; j++)
{
Capture ccnp = gt.Captures[j];
Console.WriteLine(" Capture[{0}] value is:{1}. Index is:{2}", j, ccnp.Value, ccnp.Index);
}
Console.WriteLine("-------Next Group-----");
}

CaptureCollection ccn = m.Captures;
Console.WriteLine("\n--------------------------------CaptureCollection={0}", ccn.Count);

for (int i = 0; i < ccn.Count; i++)
{
Capture gt = ccn[i];
Console.WriteLine(" Capture[{0}] value is:{1}. Index is:{2}", i, gt.Value, gt.Index);
Console.WriteLine("-------Next CaptureCollection-----");
}


楼主 运行一下自己看一看吧
wackyboy 2008-12-22
  • 打赏
  • 举报
回复
Captures 是捕获对象的集合 我很少用
我是这么理解的:
当Captures属于Group的时候 因为每一个捕获组其实就只有一个捕获,这样Captures就只有一个,其结果和Group[1] 应该是一样的
当Captures属于Match时 Match.Captures 的值 就和Match.Value 一样
数量都是一个
这是我的理解 很没底的

等待高手的解释!!
Dic4000 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wackyboy 的回复:]
你的正则表达式是"(a|b|r)" ,可以这么理解 首先这是一个正则表达式 匹配整个符合规则的字符串,整个正则表达式还包含一个Group 所以还应该包含一个匹配这个组的结果
在你的结果中 Group[0]是匹配你这个整个的表达式的字符串,Group[1]才是你的表达式中的第一个组的字符串
例如正则"(a)c" 那么 Group[0] 为ac,Group[1]=a
Group[0]的值和Match的值是一样的 就是匹配整个正则的字符串
[/Quote]

谢谢,你的例子很形象,group我理解了.
那如果是Captures又该怎么理解呢?一个group里面包含一个Captures集合,这个集合里又有多个Capture的对象.
C_sdnElf 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 C_sdnElf 的回复:]
加了括号好像匹配一次....


关注...
[/Quote]


是又匹配一次.....
C_sdnElf 2008-12-20
  • 打赏
  • 举报
回复
加了括号好像匹配一次....


关注...
Dic4000 2008-12-20
  • 打赏
  • 举报
回复
顶一下
lipbb 2008-12-19
  • 打赏
  • 举报
回复
关注,
很奇怪.
不加括号的时候只输出一个b:1

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧