【发布时间】:2010-09-30 20:14:11
【问题描述】:
我似乎无法弄清楚 Regex (.net) 中的捕获 + 组。
假设我有以下输入字符串,其中每个字母实际上是更复杂的正则表达式的占位符(因此简单的字符排除不起作用):
CBDAEDBCEFBCD
或者,更一般地说,这是一个用“正则表达式”编写的字符串模式:
(C|B|D)*A(E*)(D|B|C)*(E*)F(B|C|D)*
只有一个 A 和一个 F。 我需要将发生在 A 之后和 F 之前的 B、C、D 的所有实例(在我的应用程序中是更复杂的组)作为单独的“捕获”(或匹配或组)捕获。我还需要 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)
然后我那没用的大脑罢工了。
那么,解决这个问题的正确方法是什么?是否真的需要环顾四周?
谢谢!
【问题讨论】: