C#正则表达式:group和capture
来源:互联网 发布:安卓乐器软件 编辑:程序博客网 时间:2024/05/16 14:58
- /// <summary>
- /// 显示Match内多个Group的例子
- /// </summary>
- public void ShowStructure()
- {
- //要匹配的字符串
- string text = "1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080";
- //正则表达式
- string pattern = @"((/d+)([a-z]))/s+";
- //使用RegexOptions.IgnoreCase枚举值表示不区分大小写
- Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
- //使用正则表达式匹配字符串,仅返回一次匹配结果
- Match m = r.Match(text);
- while (m.Success)
- {
- //显示匹配开始处的索引值和匹配到的值
- System.Console.WriteLine("Match=[" + m + "]");
- CaptureCollection cc = m.Captures;
- foreach (Capture c in cc)
- {
- Console.WriteLine("/tCapture=[" + c + "]");
- }
- for (int i = 0; i < m.Groups.Count; i++)
- {
- Group group = m.Groups[i];
- System.Console.WriteLine("/t/tGroups[{0}]=[{1}]", i, group);
- for (int j = 0; j < group.Captures.Count; j++)
- {
- Capture capture = group.Captures[j];
- Console.WriteLine("/t/t/tCaptures[{0}]=[{1}]", j, capture);
- }
- }
- //进行下一次匹配.
- m = m.NextMatch();
- }
- }
这段代码的执行效果如下:
Match=[1A ]
Capture=[1A ]
Groups[0]=[1A ]
Captures[0]=[1A ]
Groups[1]=[1A]
Captures[0]=[1A]
Groups[2]=[1]
Captures[0]=[1]
Groups[3]=[A]
Captures[0]=[A]
Match=[2B ]
Capture=[2B ]
Groups[0]=[2B ]
Captures[0]=[2B ]
Groups[1]=[2B]
Captures[0]=[2B]
Groups[2]=[2]
Captures[0]=[2]
Groups[3]=[B]
Captures[0]=[B]
..................此去省略一些结果
Match=[16N ]
Capture=[16N ]
Groups[0]=[16N ]
Captures[0]=[16N ]
Groups[1]=[16N]
Captures[0]=[16N]
Groups[2]=[16]
Captures[0]=[16]
Groups[3]=[N]
Captures[0]=[N]
通过对上面的代码结合代码的分析,我们得出下面的结论,在((/d+)([a-z]))/s+这个正则表达式里总共包含了四个Group,即分组,按照默认的从左到右的匹配方式,其中Groups[0]代表了整个分组,其它的则是子分组,用示意图表示如下:
在上面的代码中是采用了Regex类的Match()方法,调用这种方法返回的是一个Match,要处理分析全部的字符串,还需要在while循环的中通过Match类的NextMatch()方法返回下一个可能成功的匹配(可通过Match类的Success属性来判断是否成功匹配)。上面的代码还可以写成如下形式:
- /// <summary>
- /// 使用Regex类的Matches方法所有所有的匹配
- /// </summary>
- public void Matches()
- {
- //要匹配的字符串
- string text = "1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080";
- //正则表达式
- string pattern = @"((/d+)([a-z]))/s+";
- //使用RegexOptions.IgnoreCase枚举值表示不区分大小写
- Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
- //使用正则表达式匹配字符串,返回所有的匹配结果
- MatchCollection matchCollection = r.Matches(text);
- foreach (Match m in matchCollection)
- {
- //显示匹配开始处的索引值和匹配到的值
- System.Console.WriteLine("Match=[" + m + "]");
- CaptureCollection cc = m.Captures;
- foreach (Capture c in cc)
- {
- Console.WriteLine("/tCapture=[" + c + "]");
- }
- for (int i = 0; i < m.Groups.Count; i++)
- {
- Group group = m.Groups[i];
- System.Console.WriteLine("/t/tGroups[{0}]=[{1}]", i, group);
- for (int j = 0; j < group.Captures.Count; j++)
- {
- Capture capture = group.Captures[j];
- Console.WriteLine("/t/t/tCaptures[{0}]=[{1}]", j, capture);
- }
- }
- }
- }
上面的这段代码和采用While循环遍历所有匹配的结果是一样的,在实际情况中有可能出现不需要全部匹配而是从某一个位置开始匹配的情况,比如从第32个字符处开始匹配,这种要求可以通过Match()或者Matches()方法的重载方法来实现,仅需要将刚才的实例代码中的MatchCollection matchCollection = r.Matches(text);改为MatchCollection matchCollection = r.Matches(text,48);就可以了。
输出结果如下:
Match=[5M ]
Capture=[5M ]
Groups[0]=[5M ]
Captures[0]=[5M ]
Groups[1]=[5M]
Captures[0]=[5M]
Groups[2]=[5]
Captures[0]=[5]
Groups[3]=[M]
Captures[0]=[M]
Match=[16N ]
Capture=[16N ]
Groups[0]=[16N ]
Captures[0]=[16N ]
Groups[1]=[16N]
Captures[0]=[16N]
Groups[2]=[16]
Captures[0]=[16]
Groups[3]=[N]
Captures[0]=[N]
注意上面的MatchCollection matchCollection = r.Matches(text,48)表示从text字符串的位置48处开始匹配,要注意位置0位于整个字符串的之前,位置1位于字符串中第一个字符之后第二个字符之前,示意图如下(注意是字符串“1A”与“2B”之间有空格):
在text的位置48处正好是15M中的5处,因此返回的第一个Match是5M而不是15M。这里还继续拿出第一篇中的图来,如下:
从上图可以看出Capture、Group及Match类之间存在继承关系,处在继承关系顶端的Capture类中就定义了Index、Length和Value属性,其中Index表示原始字符串中发现捕获子字符串的第一个字符的出现位置,Length属性表示子字符串的长度,而Value属性表示从原始字符串中捕获的子字符串,利用这些属性可以实现一些比较复杂的应用。
- C#正则表达式:group和capture
- 正则表达式的Match,Group,Capture类
- 正则表达式 GROUP 分组 C#
- C#正则表达式编程(三):Match类和Group
- C#正则表达式类Match和Group类的理解
- C#正则表达式类Match和Group类的理解
- 正则non-capture group 小记
- Python正则表达式学习(2)——字符集 [] 与 分组(capture group) ()
- 正则表达式的捕获组(capture group)在Java中的使用
- 正则表达式re中的group和groups
- C#和正则表达式
- C#正则表达式编程(三):Match类和Group类用法
- C#正则表达式编程(三):Match类和Group类用法
- C#正则表达式编程(三):Match类和Group类用法 【转】
- C#正则表达式编程(三):Match类和Group类用法
- 正则表达式的group
- 正则表达式group理解
- 正则表达式Group分组
- java使用序列化实现深克隆
- SDWebImage使用——一个可管理远程图片加载的类库
- 远程访问jboss
- golang中赋值string到array
- 一位ACMer过来人的心得
- C#正则表达式:group和capture
- 201310月报表连接
- 段式存储、页式存储及段页式存储
- Asp.net(C#) windows 服务{用于实现计划任务,事件监控等}
- 结构化与非结构化数据库
- 进程同步的几种机制
- COM机制
- jquery中常用的SET和GET$(”#msg”).html循环
- WIKIOI 2461 反质数