【问题标题】:Regex .NET attached named group正则表达式 .NET 附加命名组
【发布时间】:2011-08-20 19:54:51
【问题描述】:

我想获得附加的命名组。

原文:

1/2/3/4/5|id1:value1|id2:value2|id3:value3|1/4/2/7/7|id11:value11|id12:value12|

Group1:
1/2/3/4/5|id1:value1|id2:value2|id3:value3|
Sub groups:
id1:value1|
id2:value2|
id3:value3|

Group2:
1/4/2/7/7|id11:value11|id12:value12|
Sub groups:
id11:value11|
id12:value12|

我该怎么做?

【问题讨论】:

  • @Mike: .NET => C# 或 VB.NET。
  • 为什么不直接拆分| 上的字符串,然后按 4 个一组查看结果?
  • 我添加了一个简单的回答问题的答案,但我怀疑有一个更简单的解决方案,如果你可以添加一些关于你正在做什么的细节。还有一点:“组”和“子组”是什么意思?你想要一个 Match 对象,以及你所描述的组吗?
  • 我使用 C#。但这原则上并不重要,如果这可以在一个模式中完成,那么获取模式很重要。

标签: .net regex capturing-group


【解决方案1】:

虽然这个任务很简单,没有拆分的复杂性,.Net 正则表达式匹配使用Group.Captures 集合保存每个组的所有捕获的记录(与我所知道的任何其他风格不同)。

匹配:

string pattern = @"(?<Header>\d(?:/\d)*\|)(?<Pair>\w+:\w+\|)+";
MatchCollection matches = Regex.Matches(str, pattern);

用途:

foreach (Match match in matches)
{
    Console.WriteLine(match.Value); // whole match ("Group1/2" in the question)
    Console.WriteLine(match.Groups["Header"].Value);
    foreach (Capture pair in match.Groups["Pair"].Captures)
    {
        Console.WriteLine(pair.Value); // "Sub groups" in the question
    }
}

工作示例:http://ideone.com/5kbIQ

【讨论】:

  • 谢谢,这很好。我如何使用下一个模式: (?
    \d(?:/\d)*\|)((?\w+):(?\w+)\|)+ ?在 C# 代码中比较 Id 和 Value。
猜你喜欢
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多