5.4.5. C#中如何获得带名字name的捕获capture的组group

对于输入字符串为:


<A 
href="file:///C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15/王珞丹 图片22[3].jpg"><IMG 
style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" 
title="王珞丹 图片22" border=0 alt="王珞丹 图片22" 
src="file:///C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15/王珞丹 图片22_thumb.jpg" 
width=176 height=244></A>

        

用下面的代码:


string imgP = @"href=""(file:///(?<localAddrPref>.+?WindowsLiveWriter.+?/supfile[^/]+?)/(?<realName>[^""]+?)\[\d+\](\.(?<suffix>\w{3,4}))?)"".+?src=""(file:///\k<localAddrPref>/\k<realName>_thumb(\.\k<suffix>)?)""";
Regex imgRx = new Regex(imgP, RegexOptions.Singleline);
MatchCollection foundImg = imgRx.Matches(curSelectCotent);

        

是可以获得所匹配的group的,但是想要对应带名字的的那些变量,比如localAddrPref,suffix等值,却不知道如何获得。

其实,根据Grouping Constructs的解释,也已经知道如何可以获得,只是觉得那种方法不够好,希望可以找到对应的capture对应的自己的处理方法。

后来找了下,参考Regex: Named Capturing Groups in .NET才明白,原来对于带名字的匹配的group,其实也是group,但是是对于每一个match来说,都有对应的自己的capture的。

结果去试了试,发现如果写成这样:


CaptureCollection captures = found.Captures;
localAddrPref   = captures[0].Value;
title           = captures[1].Value; // will lead to code run dead !

        

captures[0]是整个的字符串,而不是对应的第一个name group的值,而captures[1],则直接导致程序死掉,即不能这样调用。

另外,在Regex: get the name of captured groups in C#也找到了用GetGroupNames的方式,有空也去试试。

看到Regular Expression Classes解释的,可以直接用groupname取得对应的值的,即之前都是用found.Groups[3].ToString()而换作found.Groups["localAddrPref"].Value即可。

其中localAddrPref是前面的某个group的name。