2009-12-18 7 views
1

J'essaye d'analyser un manuscrit de Powershell pour ses fonctions et paramètres. Je suis presque là, j'ai des problèmes avec les nouvelles lignes. L'expression analyse paresseux test2 à test6 mais avec test1 je ne peux pas le faire fonctionner.RegEx obtenant le script et les paramètres .. presque là

Je pourrais bien sûr spécifier que mes clients n'utilisent pas la première syntaxe, mais il doit y avoir un moyen. Quelqu'un peut me diriger dans la bonne direction? FWIW: J'utilise ceci en C#.

Le regex J'utilise est: "function (\w*)\s*\{\s*param\((.*)\)\s*}"

contenu testfile.ps1:

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


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

} 

function test3 
{ param(blabla3)} 

function test4 { param(blabla4) } 
function test5 {param(blabla5)} 
function test6{param(blabla6)} 

Merci, Alex

Répondre

0

Est-ce votre regex en une seule ligne ou d'un match à plusieurs lignes mode?

Je pense:

"^function (\w*)\s*\{\s*param\((.*)\)\s*}$" 

pourrait fonctionner en mode multi-ligne. Je n'ai pas Expresso ouvert disponible dès maintenant pour le tester.

+0

Il s'agissait d'un mode multiligne. Mais comme mentionné ci-dessus, les options de début de ligne et de fin de ligne ne fonctionnent pas correctement. – Alex

+0

Cool. Cool. Heureux que tu es parvenu à le faire fonctionner. – GrayWizardx

1

Étant donné que vous n'avez pas affiché le code, je suppose que vous n'avez pas indiqué à l'objet Regex que les retours à la ligne étaient autorisés. Vous pouvez le faire avec l'option RegexOptions.Singleline. Cela change le comportement du. expression pour lui permettre de correspondre à newline (\ n). Cependant, si vous faites votre expression pourrait correspondre plus que vous voulez. Les expressions régulières sont gourmandes et ce (.*) consommera jusqu'à la dernière parenthèse dans le fichier. Vous voudrez peut-être essayer quelque chose comme:

function (\w*)\s*\{\s*param\(([^)]*)\)\s*} 
+0

Cela semble bien, mais notez qu'il ne permet pas d'espace supplémentaire après 'function' ou' param': '^ \ s * fonction \ s * (\ w *) \ s * \ {\ s * param \ s * \ (([^)] *) \) ' J'ai également évité de capturer le reste de la fonction car il ne semble pas que vous en ayez besoin. –

+0

Cela fait effectivement l'affaire! Merci! J'avais expérimenté avec cette option mais (. *) A probablement gâché les choses. La seule chose maintenant est qu'il semble créer 3 groupes au lieu de 2. Il y a toujours un espace en tant que premier groupe. Je peux éliminer ceux avec un \ s * 'fin, mais je ne comprends toujours pas pourquoi cela arrive. @ ciaran-walsh: les '^' et '$' ne fonctionnent pas. Peut-être parce que c'est un Singleline maintenant? – Alex

0
function (\w*).*?\{.*?[A-Za-z]+\((.*?)\).*?} 

Activer multiligne correspondant sur "" comme mentionné et l'utiliser. J'ai testé contre http://www.myregextester.com/ et cela a semblé fonctionner. J'ai remplacé votre \s* par .*?. Ceci correspond à n'importe quel caractère, non gourmand, jusqu'à la prochaine séquence spécifiée.

+0

Oui, en effet, ça fait l'affaire! Merci! – Alex

Questions connexes