2010-09-30 214 views
0

我似乎無法弄清正則表達式(.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(以及正確啓動= A,端= F)

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

相同的結果與上述(只是增加了一個+後( ?B | C | d))

​​

擺脫環視東西...同樣的結果如上

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

然後我摹無所作爲的大腦繼續罷工。

那麼,解決這個問題的正確方法是什麼?是否真的需要環視?

謝謝!

回答

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 
+0

真的!所以不需要lookaround呃...太棒了。 – Jimmy 2010-10-01 00:44:17

+0

@Jimmy:在這種情況下,是的,不需要lookarounds。但他們確實有他們的用途。 :P – 2010-10-01 09:04:45

0

既然你說的C,B,D所有的實例,我想你想使用該[CBD]*分組此外,如果你只是尋找的東西是字母后AF之前,那麼你就應該能夠使用這些文字以及一些排除。

這是我想出的一種模式。集團$4應包含字母DBC

([^A]*)(A)([^CBDF]*)([CBD]*)([^F]*)(F)(.*) 

下面是this pattern in action一個例子。

問題是,如果原始字符串是CBDAEDEBECEFBCD,你想要什麼?

+0

對不起,所有的字母都爲更復雜的組織分配持有者(我會更新問題) - 所以我不能僅僅使用文字排除。你建議的字符串CBDAEDEBECEFBCD根本不應該匹配 - 在A和第一個(B | C | D)之間只有一堆E,在F之前有一堆E。同樣,在我的應用程序中,不只是E's,它們只是我不需要的文字。 – Jimmy 2010-09-30 21:07:10

+0

如果是這種情況,那麼環視可能是您唯一的選擇。 – Snekse 2010-09-30 21:15:18

+0

你能建議環顧一下嗎?即使環顧四周,我仍然無法實現它的工作。 – Jimmy 2010-09-30 22:04:35