RegEx получить сценарий и параметры .. почти там - PullRequest
1 голос
/ 18 декабря 2009

Я пытаюсь разобрать скрипт Powershell на предмет его функций и параметров. Я почти там, но у меня проблемы с переводом строки. Выражение отлично разбирает test2 на test6, но с test1 я не могу заставить его работать.

Конечно, я могу указать, что мои клиенты не используют первый синтаксис, но должен быть способ. Может ли кто-нибудь указать мне правильное направление? FWIW: я использую это в C #.

Я использую регулярное выражение: "function (\w*)\s*\{\s*param\((.*)\)\s*}"

content 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)}

Спасибо, Alex

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

Поскольку вы не показывали свой код, я предполагаю, что вы не сообщили объекту Regex, что разрешены переводы строки. Вы можете сделать это с помощью опции RegexOptions.Singleline. Это меняет поведение. выражение, позволяющее сопоставить его с символом новой строки (\ n). Тем не менее, если вы делаете, ваше выражение может соответствовать больше, чем вы хотите. Регулярные выражения являются жадными, и это (.*) будет занимать до последней круглой скобки в файле. Вы можете попробовать что-то вроде:

function (\w*)\s*\{\s*param\(([^)]*)\)\s*}
0 голосов
/ 18 декабря 2009
function (\w*).*?\{.*?[A-Za-z]+\((.*?)\).*?}

Включить многострочное сопоставление на "." как уже упоминалось и использовать это. Я протестировал против http://www.myregextester.com/, и, похоже, это сработало.

Я заменил ваш \s* на .*?. Соответствует любому символу, не являющемуся жадным, до следующей указанной последовательности.

0 голосов
/ 18 декабря 2009

Является ли ваше регулярное выражение в однострочном или многострочном режиме поиска?

Я думаю:

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

может работать в многострочном режиме. У меня нет Expresso открытого, доступного прямо сейчас, чтобы проверить его.

...