2013-08-19 27 views
5

Powiedzmy, że moje wejście to fn(a(b,c),d) fn(a,d) fn(a(b),d) i chcę a(b,c),d jak napisać wzór, aby uzyskać wszystko wewnątrz()? 2. fn() jest łatwy pierwsze i trzecie nie wiem jak dopasowaćRegex śledzenie `)`

+0

Czy dostałeś biały odstęp? jest jak separator? Możesz spróbować 'fn [(] (\ S *) [)]'. – abiessu

+0

Czy 'fn' może zawierać więcej' fn's, czy też 'a' /' b'/'c''s? Czy dane wejściowe zawierają wiele "fn", czy tylko jeden? Jeśli jest ich wiele, czy są po prostu "fn" z rzędu, czy może między nimi jest coś innego? Jak głębokie jest zagnieżdżenie - czy 'fn (a (b (c))) jest ważne? – Kobi

Odpowiedz

5

Trzeba balancing group definitions na to:

result = Regex.Match(subject, 
    @"(?<=\()    # Make sure there's a (before the start of the match 
     (?>    # now match... 
      [^()]+   # any characters except parens 
     |     # or 
      \( (?<DEPTH>) # a (, increasing the depth counter 
     |     # or 
      \) (?<-DEPTH>) # a), decreasing the depth counter 
     )*     # any number of times 
     (?(DEPTH)(?!))  # until the depth counter is zero again 
     (?=\))    # Make sure there's a) after the end of the match", 
    RegexOptions.IgnorePatternWhitespace).Value; 
2

Można podzielić ją

var output=Regex.Split(input,@"(?:\)|^)[^()]*(?:\(|$)"); 

Otrzymasz dane wyjściowe jako

+0

Twój wzór dzieli wszystko pomiędzy ')' i '(To spowoduje, że podzielone zostanie' fn (a(), b()) 'i wiele innych odmian. (Oczywiście, nie wiemy * czy są one możliwe) – Kobi

+0

@Kobi yes..indeed..ur right..op powinien potwierdzić tę możliwość .. – Anirudha