2012-05-08 6 views
0

Je ne suis pas bon avec les expressions régulières, j'ai donc besoin d'aide avec une expression régulière qui va extraire toutes les déclarations de fonctions C à partir d'un document Word. J'ai le mot doc chargé en mémoire et j'ai lu le texte, donc ce n'est pas un problème. De plus, toutes les fonctions commencent avec INTERNAL_ et se terminent évidemment avec); par exemple.Expression régulière pour extraire toutes les déclarations de fonction

INTERNAL_DisplayMessage (param a, int b);

Donc, fondamentalement, j'ai besoin de l'expression régulière qui extraira toute la déclaration de fonction de INTERNAL_ à. La valeur de retour est la même pour toutes les API, ce qui n'est pas pertinent.

+2

Avez-vous essayé quelque chose? Pourquoi ça n'a pas marché? –

+0

'résultats MatchCollection = Regex.Matches (texte, @" \ ((^ ^)] *) \) ");' C'est ce que j'ai essayé, je ne suis vraiment pas bon avec les expressions régulières, n'a jamais eu à utiliser ceux. Cette expression régulière m'apporte tout en(), j'essaie de comprendre comment obtenir INTERNAL_ et); dans cette expression. – tunafish24

+1

s'il vous plaît poster une question au lieu d'une demande de tâche –

Répondre

2

Quelque chose d'aussi simple que (INTERNAL_.+?\);) devrait fonctionner. Je recommande fortement RegExr pour ces types de tâches.

+0

cela ne fonctionne pas non plus ... je ne reçois aucun match. – tunafish24

+0

Pouvez-vous nous montrer le texte, ou une petite partie de celui-ci? Quand je cours votre code avec mon regex sur le texte de votre message initial, j'obtiens 2 matchs. –

+0

Depuis, sa documentation interne, je ne peux pas poster ici, mais voici le format approximatif: 'C'est la méthode a, qui sera appelée INTERNAL_MethodA (\ n \t int param1, \ n \t int param2 \ n ); \ n \ n Remarque: Appelez cette méthode avec soin. » – tunafish24

2

Vous devez utiliser ce regex:

(INTERNAL_[^ ]+?\s?\(.*?\);) 

Les parenthèses extérieures font tout le texte d'une fonction pour obtenir capturé l'intérieur d'un groupe.

Les parenthèses déclaraton de la fonction sont protégées par une barre oblique inverse \(\), de sorte qu'elles sont traitées comme des littéraux au lieu de groupements.

[^ ]\s? signifie tout caractère qui ne fait pas l'espace, une ou plusieurs fois, follorwed par un espace optionnel juste avant la parenthèse ouvrante

.*? désigne tout caractère, * un certain nombre de fois (y compris o), au moins aussi possibles

comme vos déclarations fonctions comprennent \ n l'intérieur d'eux, vous devez créer votre regex en utilisant l'option RegexOptions.Singleline comme second paramètre du constructeur regex:

Spécifie le mode de ligne unique. Modifie la signification du point (.) Afin qu'il corresponde à tous les caractères (au lieu de tous les caractères sauf \ n).

Voir doc à: RegexOptions Enumeration

Un bon endroit pour chek regexes est celui-ci:

www.regexplanet.com

il vous permet de changer la langue et les options. Pour l'option SinleLine, vérifiez que le point '. (.) Correspond à tous les caractères au lieu de tous les caractères sauf l'option newlines (Singleline)' sur cette page.

+0

+1 Cela devrait donner moins de faux positifs que ma réponse car elle nécessite les parenthèses d'ouverture et de fermeture. –

+0

Cela ne renvoie aucun résultat, même pas sur le site que vous avez mentionné. S'il vous plaît, essayez-le avec la nouvelle ligne, je suis toujours en train de bricoler avec des paramètres - l'approche de la force brute essentiellement. – tunafish24

+0

Ouais, ça marche pour moi. C'est une meilleure solution que le hack '[^]' que j'ai suggéré. –

Questions connexes