2010-06-29 3 views
0

Je cette defitiion enum dans le fichier:C# Regex pour correspondre le type de carrosserie ENUM

public enum IdentityState 
{ 
    [EnumMember] 
    New = 0, 
    [EnumMember] 
    Normal = 1, 
    [EnumMember] 
    Disabled = 2 
} 

{ some other data... } 

et que vous voulez faire correspondre que le corps de cette ENUM (entre {}), le résultat du match que je veux est:

{ 
    [EnumMember] 
    New = 0, 
    [EnumMember] 
    Normal = 1, 
    [EnumMember] 
    Disabled = 2 
} 

Je fais modèle regex comme ceci:

public enum.*\w.*(?<enumBody>[\S|\s|]+\}{1})

mais le résultat est le suivant:

{ 
    [EnumMember] 
    New = 0, 
    [EnumMember] 
    Normal = 1, 
    [EnumMember] 
    Disabled = 2 
} 

{ some other data... } 

Ce qui est pas ce que je pense, car il inclut également la prochaine chaîne { some other data } que je ne veux pas. Je ne sais pas comment faire un motif pour arrêter après le premier }.

Répondre

1

Rendez le quantificateur + paresseux en utilisant ?. Vous n'avez pas besoin de la pièce {1}.

public\s+enum\s+\w+\s*(?<enumBody>\{[\S|\s|]+?\}) 
+1

N'est-ce pas le premier. * Qui a aussi besoin d'être rendu paresseux? Il me semble que vous correspondez à une parenthèse bouclée groupée à la fin mais le. * Signifie que vous pouvez avoir n'importe quelle quantité de substance entre l'enum et le {. – Chris

+0

@Chris ouais, vous avez raison. Regex n'est pas le bon outil pour l'analyse de code (lorsqu'il est utilisé seul) pour commencer. – Amarghosh

0

essayez de mettre^à l'avant de votre regex.

+0

Merci à tous pour l'aide, enfin j'utiliser thi s modèle: 'public \ s + enum \ s + \ w + \ s * (? [^}] +}) ' – psulek

0

Un quantificateur paresseux fonctionnera si c'est toute expression régulière, mais si vous voulez éviter le match de passer devant l'accolade de fin, alors il est préférable d'interdire explicitement ce caractère dans le cadre du groupe à l'aide [^}]:

public enum.*\w.*(?<enumBody>[^}]+}) 

Si vous ne voulez pas inclure d'espace avant l'accolade ouverte, vous pouvez faire la même chose sur le devant:

public enum[^{]*(?<enumBody>{[^}]+}) 
Questions connexes