2013-08-19 2 views
5

Disons que mon entrée est fn(a(b,c),d) fn(a,d) fn(a(b),d) et je veux a(b,c),d comment pourrais-je écrire un motif pour obtenir tout à l'intérieur de la()? La 2ème fn() est facile le premier et le troisième, je ne sais pas comment faire correspondreRegex garder la trace de `)`

+0

Etes-vous donné un espace blanc? aracter comme séparateur? Vous pouvez essayer 'fn [(] (\ S *) [)]'. – abiessu

+0

Est-ce que 'fn' peut contenir plus de' fn's, ou juste 'a' /' b'/'c'? Est-ce que l'entrée contient plusieurs 'fn', ou juste un? S'il y en a beaucoup, sont-ils simplement «fn» dans une rangée, ou peut-il être autre chose entre eux? Quelle est la profondeur de l'imbrication - est-ce que 'fn (a (b (c)))' est valide? – Kobi

Répondre

5

Vous avez besoin balancing group definitions pour cela:

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

Vous pouvez diviser

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

Vous obtiendriez la sortie comme

a(b,()c),d 
a,d 
a(b),d 
+0

Votre motif sépare tout ce qui se trouve entre ')' et '('. Il divisera automatiquement 'fn (a(), b())', et beaucoup d'autres variations. (Bien sûr, nous ne * savons * pas si elles sont possible) – Kobi

+0

@Kobi oui..indeed..ur droite..op devrait confirmer cette possibilité .. – Anirudha

Questions connexes