博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中正则表达式 Group 分组
阅读量:5965 次
发布时间:2019-06-19

本文共 2395 字,大约阅读时间需要 7 分钟。

在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组功能。

在 C# 正则表达式中,Regex 成员关系如下,其中 Group 是其分组处理类。

Regex –> MatcheCollection (匹配项集合)

          –> Match (单匹配项 内容)

                –> GroupCollection (单匹配项中包含的 "(分组/子表达式项)" 集合)

                      –> Group ( "(分组/子表达式项)" 内容)

                            –> CaputerCollection (分组项内容显示基础?)

                                  –> Caputer

Group 对分组有两种访问方式:

1、数组下标访问

在 ((\d+)([a-z]))\s+ 这个正则表达式里总共包含了四个分组,按照默认的从左到右的匹配方式,

Groups[0]    代表了匹配项本身,也就是整个整个表达式 ((\d+)([a-z]))\s+

Groups[1]    代表了子表达式项 ((\d+)([a-z]))

Groups[2]    代表了子表达式项 (\d+)

Groups[3]    代表了子表达式项 ([a-z])

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
string 
text =
"1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080"
;
Response.Write(text +
"<br/>"
);
 
string 
strPatten =
@"((\d+)([a-z]))\s+"
;
Regex rex =
new 
Regex(strPatten, RegexOptions.IgnoreCase);
MatchCollection matches = rex.Matches(text);
 
//提取匹配项
foreach 
(Match match
in 
matches)
{
    
GroupCollection groups = match.Groups;
    
Response.Write(
string
.Format(
"<br/>{0} 共有 {1} 个分组:{2}<br/>"
                                
, match.Value, groups.Count, strPatten));
 
    
//提取匹配项内的分组信息
    
for 
(
int 
i = 0; i < groups.Count; i++)
    
{
        
Response.Write(
            
string
.Format(
"分组 {0} 为 {1},位置为 {2},长度为 {3}<br/>"
                        
, i
                        
, groups[i].Value
                        
, groups[i].Index
                        
, groups[i].Length));
    
}
}
 
/*
 
* 输出:
 
1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080
 
1A 共有 4 个分组:((\d+)([a-z]))\s+
分组 0 为 1A ,位置为 0,长度为 3
分组 1 为 1A,位置为 0,长度为 2
分组 2 为 1,位置为 0,长度为 1
分组 3 为 A,位置为 1,长度为 1
  
 
....
  
 
*/

 

2、命名访问

利用 (?<xxx>子表达式) 定义分组别名,这样就可以利用 Groups["xxx"] 进行访问分组/子表达式内容。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string 
text =
"I've found this amazing URL at , and then find "
;
Response.Write(text +
"<br/>"
);
 
string 
pattern =
@"\b(?<protocol>\S+)://(?<address>\S+)\b"
;
Response.Write(pattern.Replace(
"<"
,
"&lt;"
).Replace(
">"
,
"&gt;"
) +
"<br/><br/>"
);
 
MatchCollection matches = Regex.Matches(text, pattern);
foreach 
(Match match
in 
matches)
{
    
GroupCollection groups = match.Groups;
    
Response.Write(
string
.Format(
                    
"URL: {0}; Protocol: {1}; Address: {2} <br/>"
                    
, match.Value
                    
, groups[
"protocol"
].Value
                    
, groups[
"address"
].Value));
}
 
/*
 
* 输出
 
I've found this amazing URL at , and then find
    
\b(?<protocol>\S+)://(?<address>\S+)\b
 
    
URL: ; Protocol: http; Address: www.sohu.com
    
URL: ; Protocol: ftp; Address: ftp.sohu.comisbetter
 
 
*/

 

内容参考自:

C#正则表达式编程(三):Match类和Group类用法    

C#正则表达式类Match和Group类的理解    

转载于:https://www.cnblogs.com/lip-blog/p/9112285.html

你可能感兴趣的文章
BIM 360 Docs API在操作欧洲数据中心内容的一些调整
查看>>
PostgreSQL的实践一:数据类型(一)
查看>>
K近邻算法的kd树实现
查看>>
JavaScript设计模式-工厂方法模式
查看>>
从 1 到完美,用 node 写一个命令行工具
查看>>
Java Platform SE 8 中文文档
查看>>
2018年第31周-hive支持的Delete和Update的配置
查看>>
Spring AOP 源码初窥(二) 从注解开始
查看>>
如何利用Webp和http缓存节省30%的网络流量
查看>>
JS实现监控微信小程序
查看>>
CSS基础
查看>>
深入理解 MVC 中的 M 与 C
查看>>
你好,我是比特币
查看>>
函数式编程了解一下(上)
查看>>
addRoutes爬坑记
查看>>
关于协程和 ES6 中的 Generator
查看>>
理解节流和防抖
查看>>
懒加载、瀑布流和LightBox实现图片搜索效果
查看>>
laravel框架学习之路(一)前后台用户认证分离
查看>>
比特币钱包安全
查看>>