5.4.6.1. C#中,如果Regex中包括了子括号,即括号嵌套括号的时候,group的index是如何计算的,以及如果Regex中包括了带name的group,group的index是如何计算的

搞了半天,最后终于看懂了。

现在来说说,如何数group的index。

其实很简单:

  1. 首先,所有的group,分两类,一类是默认的,无名字(unnamed的group),另外一类是有名字的group(name的group)。
  2. 然后对于group的index,从左至右,以左括号出现的位置先后为标准,一个个的数一下对应的unnamed的group,等全部数完了,再去安装同样标准去数有名字的group。
  3. 或者可以完全不去数有name的group,因为有name的group的值,完全可以直接通过Groups["yorGroupName"].Value的形式得到。

举例说明:

对于例子中的匹配样式:


href=""file:///((?<localAddrPref>.+?WindowsLiveWriter.+?/supfile[^/]+?)/(?<realName>[^""]+?)\[\d+\](\.(?<suffix>\w{3,4}))?)"".+?title=""?(\k<realName>)?""?.+?alt=""?(\k<realName>)?""?.+?src=""file:///(\k<localAddrPref>/\k<realName>_thumb(\.\k<suffix>)?)""

            

从左往右,第一个是file:///后面的左括号,即对应的括号是?)"".+?title中的这个右括号,

由于其是unnamed的group,所以代码中的index为第一个,为1,

对应着代码和值是:

Groups[1].ToString() == 上述调试的结果 C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15/王珞丹 图片22[3].jpg

然后再往右数,第二个括号是(?<localAddrPref>中的左括号,对应右括号是+?)/(?<realName>中的右括号,

由于其实有名字的group,所以对应的index,不是Groups[2],而是等最后数完了全部的unnamed的group,才能知道此处的index。

但是由于是有名字的,所以也是可以直接通过group的name来获得对应的值的。

对应的代码和值是:

Groups["localAddrPref"] == C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15

然后按照此法:

从左往右,依次按照左括号出现的先后顺序去数,得到对应的各个group是:

  1. 第一个: ((?<localAddrPref>.+?WindowsLiveWriter.+?/supfile[^/]+?)/(?<lrealName>[^""]+?)\[\d+\](\.(?<lsuffix>\w{3,4}))?)

    unnamed index为1,值为Groups[1].ToString()

  2. 第二个: (?<localAddrPref>.+?WindowsLiveWriter.+?/supfile[^/]+?)

    有名字,index待定,值为Groups["localAddrPref"].Value

  3. 第三个: (?<realName>[^""]+?)

    有名字,index待定,值为Groups["realName"].Value

  4. 第四个: (\.(?<suffix>\w{3,4}))

    unnamed,index为2,值为Groups[2].ToString()

  5. 第五个:(?<suffix>\w{3,4})

    有名字,index待定,值为Groups["suffix"].Value

  6. 第六个: (\k<realName>)

    unnamed,index为3,值为Groups[3].ToString()

  7. 第七个: (\k<realName>)

    unnamed,index为4,值为Groups[4].ToString()

  8. 第八个: (\k<localAddrPref>/\k<realName>_thumb(\.\k<suffix>)?)

    unnamed,index为5,值为Groups[5].ToString()

  9. 第九个: (\.\k<suffix>)

    unnamed,index为6,值为Groups[6].ToString()

对照着上述debug出来的结果,正好分别就是:

  1. Groups[1].ToString() == debug中的[0] == C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15/王珞丹 图片22[3].jpg
  2. Groups[2].ToString() == debug中的[1] == .jpg
  3. Groups[3].ToString() == debug中的[2] == 王珞丹 图片22
  4. Groups[4].ToString() == debug中的[3] == 王珞丹 图片22
  5. Groups[5].ToString() == debug中的[4] == C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15/王珞丹 图片22_thumb.jpg
  6. Groups[6].ToString() == debug中的[5] == .jpg

而unnamed的全部都数完了,然后才是从左到右的,有名字的index依次增加,以及对应的值是:

  1. Groups["localAddrPref"].Value == Groups[7].ToString() == debug中的[6] == C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles111AD15
  2. Groups["realName"].Value == Groups[8].ToString() == debug中的[7] == 王珞丹 图片22
  3. Groups["suffix"].Value == Groups[9].ToString() == debug中的[8] == jpg

所以,对于Regex中的group和named的group的index如何计算,就是上面那一句话:

从左到右,以左括号出现位置先后为顺序,index一次增加。

先全部数完unnamed的group,再去数有name的group,其中有name的group,完全可以不去计算对应的index是多少的,因为可以直接通过名字来引用对应的值,用法为:

Groups["yorGroupName"].Value