2009-11-24 7 views
0

J'essaie d'écrire une expression régulière dans .NET pour capturer toute la fonction à partir d'une liste de fonctions qui ressemblent à ceci.Expression régulière, référence arrière ou construction alternative

public string Test1() 
{ 
    string result = null; 
    foreach(var item in Entity.EntityProperties) 
    { 
     result +=string.Format("inner string with bracket{0}", "test"); 
    } 
    return result; 
} 
public string Test5() 
{ 
    return string.Format("inner string with bracket{0}", "test"); 
} 

public string Last() 
{ 
    return string.Format("inner string with bracket{0}", "test"); 
} 

alors je suis

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*public string)) 

Ce capturera tous, mais la dernière fonction ... ou ce

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*(public string)|$)) 

Cela correspondra toutes les fonctions correctement, sauf la première. La première fonction est seulement appariée partiellement.

public string Test1() 
{ 
    string result = null; 
    foreach(var item in Entity.EntityProperties) 
    { 
     result +=string.Format("inner string with bracket{0}", "test"); 
    } <-- the first capture only get to this point. 

Une idée? S'il vous plaît fournir quelques explications si possible.

+0

Devinez quoi? Les regex ne gèrent pas très bien les accolades arbitraires. –

Répondre

1

Il est en fait possible de le faire dans .NET pour vérifier le support correspondant. La clé est d'utiliser un groupe d'équilibrage. J'en ai déjà entendu parler, c'est pourquoi je pose la question. Je n'étais pas sûr de savoir comment écrire l'expression moi-même alors j'espérais que certains des experts reg reg pourrait m'aider :)

Heureusement, j'ai trouvé ce site. Qui expliquent le groupe d'équilibrage dans les détails ... il fournit même un modèle. Donc, ici, c'est pour la référence de tout le monde.

http://blog.stevenlevithan.com/archives/balancing-groups l'essentiel du motif est ici

{ 
    (?> 
     (?! { | }) . 
    | 
     { (?<Depth>) 
    | 
     } (?<-Depth>) 
    )* 
    (?(Depth)(?!)) 
} 

Mais allez voir son blog pour l'explication des détails.

+1

Vous auriez pu obtenir de meilleurs résultats si vous aviez dit ce que vous essayiez de faire dans le titre de votre question. –

+0

Vous avez raison, que pensez-vous d'un titre comme celui-ci? J'ai besoin d'une expression régulière pour capturer un corps de fonction dans le code source C#? – firefly

1

Bien que j'apprécie beaucoup les expressions rationnelles, dans votre cas elles ne fonctionneront pas car les structures imbriquées ne sont pas "régulières" et ne peuvent donc pas être mises en correspondance avec des expressions régulières. Vous avez besoin d'un analyseur pour ce genre de travail. Pardon.