RegEx и необязательная строка - PullRequest
0 голосов
/ 23 декабря 2009

У меня проблемы с необязательной группой в регулярном выражении (синтаксис .NET, и я использую RegexOptions.Singleline).

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

Также пробовал, безрезультатно: "function (\w*)[^{]+{(?:.*?\((.*?)\))?.*?}"

Похоже, что группа не является обязательной, потому что, если я просто добавлю две скобки в FunctionWithNoParameters, то все будет работать нормально. Цель состоит в том, чтобы иметь две группы: имя функции и их необязательные параметры. Кто-нибудь может мне помочь?

Текст, который я пытаюсь разобрать, выглядит примерно так:

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

function FunctionWithNoParameters { 

return "nothing"
}

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

Спасибо, Alex

Ответы [ 2 ]

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

Это регулярное выражение работает для меня, учитывая предоставленные вами образцы данных:

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

Основная проблема с вашим регулярным выражением заключается в следующем: .*?\(. Когда вы сопоставляете вторую функцию, .*? просматривает всю функцию и находит открывающую скобку в третьей функции.

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

Попробуйте это:

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

РЕДАКТИРОВАТЬ: Странно, я не мог сопоставить эту необязательную группу param в моих тестах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...