2009-12-23 12 views
0

J'ai des problèmes avec un groupe optionnel dans une expression regex (syntaxe .NET, et j'utilise RegexOptions.Singleline).RegEx et une chaîne optionnelle

"function (\w*).*?{(?:.*?\((.*?)\))?.*?}"

également essayé, en vain: "function (\w*)[^{]+{(?:.*?\((.*?)\))?.*?}"

Il semble que le groupe n'est pas facultative, parce que si je viens d'ajouter deux parenthèses dans FunctionWithNoParameters alors que tout fonctionne bien. L'objectif est d'avoir deux groupes: le nom de la fonction et leurs paramètres optionnels. Est-ce que quelqu'un peut m'aider?

Le texte que je suis en train d'analyser est quelque chose comme:

function test1 
{ 
    param ([int]$parm2, [bool]$parm3) 
} 

function FunctionWithNoParameters { 

return "nothing" 
} 

function test2 { 
    param([string]$parm1, 
     [int]$parm2, 
     [bool]$parm3)} 

Merci, Alex

+0

Vous ne voulez pas analyser une langue non régulière avec une expression régulière, n'est-ce pas? – Gumbo

+0

Non, je ne le suis pas. Ce ne serait probablement pas la meilleure approche pour ce problème;) J'essaie d'obtenir toutes les fonctions (et leurs paramètres) dans un script Powershell ... – Alex

Répondre

0

Essayez ceci:

function (?<name>\w+)\s*?\{\s*?(?<param>param\s*\([\s\S]*?\))?[\s\S]*?\} 

EDIT: étrange, je ne pourrais pas » t correspond à ce groupe optionnel param dans mes tests

+0

Une combinaison des deux pourrait faire l'affaire je pense: 'fonction (\ w *) [^ {] + {\ s * (? param \ s * \ ([\ s \ S] *? \))?. *?} ' mais ... maintenant je reçois le le mot "param" et la parenthèse aussi bien. – Alex

1

Ce regex fonctionne pour moi compte tenu des données de l'échantillon que vous avez fourni:

@"function\s+(\w+)\s*\{\s*(?:param\s*\(([^()]*)\))?" 

Le principal problème avec votre regex est cette partie: .*?\(. Lorsque vous faites correspondre la deuxième fonction, le .*? analyse tout au long de cette fonction et trouve la parenthèse ouvrante dans la troisième fonction.

Questions connexes