正则表达式:捕捉,群体,混乱

时间:2010-09-30 20:14:12

标签: .net regex

我似乎无法弄清楚Regex(.net)中的捕获+组。

假设我有以下输入字符串,其中每个字母实际上是一个占位符,用于更复杂的正则表达式(因此简单的字符排除不起作用):

CBDAEDBCEFBCD

或者,更一般地说,这是一个用'正则表达式'编写的字符串模式:

(C|B|D)*A(E*)(D|B|C)*(E*)F(B|C|D)*

只有一个A和一个F. 我需要捕获个人'捕获'(或匹配或组)所有B,C,D(在我的应用程序中是更复杂的组)的实例,这些实例发生在A之后和F之前。我还需要A和F.我不要不需要E.我不需要A之前的C,B,D或F之后的B,C,D。

我希望得到正确的结果:

Groups["start"] (1 capture) = A
Groups["content"] (3 captures)  
  Captures[0] = D  
  Captures[1] = B
  Captures[2] = C
Groups["end"] (1 capture) = F

我尝试了一些微弱的尝试,但没有一个有效。

仅“错误地”捕获上面的示例字符串中EF之前的最后一个C(以及正确的start = A,end = F)

(?<=(?<start>A)).+(?<content>B|C|D).+(?=(?<end>F))

与上面相同的结果(刚刚添加了一个+后(?B | C | D))

(?<=(?<start>A)).+(?<content>B|C|D)+.+(?=(?<end>F))

摆脱了环顾四周的东西......与上面相同的结果

(?<start>A).+(?<content>B|C|D)+.+(?<end>F)

然后,我无所畏惧的大脑继续罢工。

那么,采用这种方法的正确方法是什么?是否真的需要环视?

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,忘记了外表,他们只是不必要地复杂化了。但我怀疑你的最终正则表达式会有效,如果你先说.+不情愿的话:

(?<start>A).+?(?<content>B|C|D)+.+(?<end>F)

编辑:是的

string s = "CBDAEDBCEFBCD";
Regex r = new Regex(@"(?<start>A).+?(?<content>B|C|D)+.+(?<end>F)");

foreach (Match m in r.Matches(s))
{
  Console.WriteLine(@"Groups[""start""] = {0}", m.Groups["start"]);
  foreach (Capture c in m.Groups["content"].Captures)
  {
    Console.WriteLine(@"Capture[""content""] = {0}", c.Value);
  }
  Console.WriteLine(@"Groups[""end""] = {0}", m.Groups["end"]);
}

输出:

Groups["start"] = A
Capture["content"] = D
Capture["content"] = B
Capture["content"] = C
Groups["end"] = F

答案 1 :(得分:0)

由于你说的是C,B,D的所有实例,我认为你想要为[CBD]*使用分组。另外,如果你只是想在字母{{{{{{{ 1}}但在A之前,您应该能够使用这些文字以及一些排除。

这是我提出的模式。小组F应包含字母$4

DBC

以下是this pattern in action的示例。

问题是,如果原始字符串为([^A]*)(A)([^CBDF]*)([CBD]*)([^F]*)(F)(.*) ,您想要什么?