从.NET regex对象获取命名组子模式

时间:2015-05-04 23:56:59

标签: c# .net regex

我们说我有以下正则表达式:

var r = new Regex("Space(?<entry>[0-9]{1,3})");

然后我有了字符串:

"Space123"

这是我的计划:

void Main()
{
    Regex r = new Regex("Space(?<entry>[0-9]{1,3})", RegexOptions.ExplicitCapture);
    foreach (Match m in r.Matches("Space123")){
        m.Groups["entry"].Dump(); //Dump() is linqpad to echo the object to console
    }
}

我想知道的是,是否有任何方法可以获得匹配的正则表达式部分?在这种情况下:

(?<entry>[0-9]{1,3})

我无法在对象的任何地方找到它,但人们会认为它可以访问。

1 个答案:

答案 0 :(得分:5)

您可以利用存储正则表达式模式的Regex.ToString()方法。可以使用Regex.GetGroupNames()Regex.GetGroupNumbers()获取命名的捕获组及其各自的索引。

此外,我们需要正则表达式模式中的捕获组的数组/列表,这就是为什么我要添加rxPairedRoundBrackets正则表达式来捕获非转义圆括号内的所有文本。

我建议使用此代码获取特定命名组的正则表达式子模式(编辑:现在,甚至处理嵌套的未转义的括号组!):

var rxPairedRoundBrackets = new Regex(@"(?sx)(?=((?<=[^\\]|^)\(
        (?>
          (?! (?<!\\)\( | (?<!\\)\) ) .
          |
          (?<!\\)\( (?<Depth>)
          |
          (?<!\\)\) (?<-Depth>)
        )*
        (?(Depth)(?!))
        (?<!\\)\)))+");
var r = new Regex(@"(?<OuterSpace>Spa(?<ce>ce))(?<entry>\([0-9]{1,3}\))", RegexOptions.ExplicitCapture);
var bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
var GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
                                 .ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("My New Space(123)"))
{
    var id = "entry";
    var grp = m.Groups[id]; // Just to see the group value
    var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}

以下是您案例的代码:

r = new Regex("Space(?<entry>[0-9]{1,3})", RegexOptions.ExplicitCapture);
bracketedGrps = rxPairedRoundBrackets.Matches(r.ToString()).Cast<Match>().Select(p => p.Groups[1].Value);
GroupDict = r.GetGroupNames().Zip(r.GetGroupNumbers(), (s, i) => new { s, i })
                             .ToDictionary(item => item.s, item => item.i);
foreach (Match m in r.Matches("Space123"))
{
   var id = "entry";
   var grp = m.Groups[id];
   var groupThatMatched = bracketedGrps.ElementAt(GroupDict[id] - 1);
}

输出:

enter image description here