c# - 从 .NET 正则表达式对象获取命名组子模式

标签 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})

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

最佳答案

您可以利用 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

关于c# - 从 .NET 正则表达式对象获取命名组子模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30042013/

相关文章:

c# - 如何将 json 转换为 NameValueCollection

java - 如何使用正则表达式删除电子邮件地址中的点 (.) 字符

sql - 使用 Oracle 正则表达式查找精确长度为 3 的数字

c# - 在c#中提取以某物开头和结尾的字符串

c# - 在单独的线程中调用方法

c# - 如何在应用程序启动之间保留对象列表

c# - 从 C# 读取和写入 Microsoft Project 2007

c# - 使用 LINQ 根据给定条件过滤 List<Point>

.NET 中的 Java AWT

c# - ASP.NET WebApi 未收到发布数据