我似乎无法弄清楚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)
然后,我无所畏惧的大脑继续罢工。
那么,采用这种方法的正确方法是什么?是否真的需要环视?
谢谢!
答案 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)(.*)
,您想要什么?