7

我有一系列遵循特定格式的分组值,并希望使用单个表达式将它们捕获到组中。例如,我已经-group1 -group2 -group3并且正在尝试使用类似于(-[\s\S]{1,}?) This is基本上允许我将整个字符串捕获到一个组中的东西,但我希望能够分别反向引用每个值。我认为这?会迫使它成为非贪婪的,因此将模式匹配分成三个单独的组(例如)。现在我只是重复引用(-[\s\S]*?),但似乎应该有一个更优雅的表达方式。
谢谢!

4

3 回答 3

16

你很幸运,因为 C# 是少数支持子表达式捕获的语言之一(如果不是唯一的话)

https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)

.NET API 可以看如下

 Matches
     Groups (most regex engines stop here)
         Captures (unique for .NET)

从你的问题中不清楚你想要完全匹配什么,但这应该让你开始。再次询问您是否被卡住。

  string input = "-group1 -group2 ";
  string pattern = @"(-\S*\W){2}";
  foreach (Match match in Regex.Matches(input, pattern))
  {
     Console.WriteLine("Match: {0}", match.Value);
     for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
     {
        Group group = match.Groups[groupCtr];
        Console.WriteLine("   Group {0}: {1}", groupCtr, group.Value);
        for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
           Console.WriteLine("      Capture {0}: {1}", captureCtr, 
                             group.Captures[captureCtr].Value);
     }                      
  } 

这输出

Match: -group1 -group2 
   Group 0: -group1 -group2 
      Capture 0: -group1 -group2 
   Group 1: -group2 
      Capture 0: -group1 
      Capture 1: -group2 

如您所见, (Group 1, Capture 0) 和 (Group 1, Capture 1) 提供组的单个捕获(而不是大多数语言中的最后一个)

这个地址我认为你描述为“能够分别反向引用每个值”

(您使用术语反向引用,但我认为您的目标不是替换模式吗?)

于 2012-06-15T13:51:14.673 回答
2

使用 .NET 正则表达式(几乎只有 .NET),您可以使用:

(?:(-\S+)\s*)+

组 1 将包含所有匹配子字符串的列表。

或者,Matches在您的情况下,仅使用就足够了:

var re = new Regex(@"-\S+");
var matches = re.Matches(str);
于 2012-06-15T13:35:58.183 回答
0

试试这个:

(-.+?)(\s|$)

您的第一个捕获组将拥有您想要的(-group1-group2等)。

如果您想更好地控制 之后允许的内容-,请更改.+?为,例如,[a-zA-Z0-9]+?仅匹配字母数字字符。

于 2012-06-15T13:32:07.053 回答