Regexp для обработки рекурсивных аргументов - PullRequest
0 голосов
/ 12 марта 2010

Я новичок в регулярных выражениях, поэтому мне интересно, что такое регулярное выражение для:

function {function arg1, arg2}, arg3

Я ищу возможность выбрать аргументы верхнего уровня: {function arg1, arg2} & arg3

В идеале ответом будет использование preg_match в PHP, но почти любое регулярное выражение будет работать нормально.

Спасибо! Matt

1 Ответ

0 голосов
/ 13 марта 2010

PCRE / Perl regex, но я просто догадываюсь, что вы хотите (в зависимости от спецификации ниже):

/(?:function\s+|\G(?<!^),\s*)([^,{}]+|\{function\s+(?1)\s*(?:,\s*(?1)\s*)*})\s*/g

Пример Использование Perl:

test('function {function arg1, arg2}, arg3');
test('function foo, {function {function x}, y}, bar');

sub test{
    print 'Matched: "', join '", "',
        $_[0] =~
        /(?:function\s+|\G(?<!^),\s*)
        (
            [^,{}]+
            |
            \{function\s+(?1)\s*(?:,\s*(?1)\s*)*}
        )
        \s*/gx;
    print "\"\n";
}

выход

Matched: "{function arg1, arg2}", "arg3"
Matched: "foo", "{function {function x}, y}", "bar"

Должно работать нормально * в PHP , просто экранировать, где необходимо, и использовать с preg_match_all.

Множество вопросов по спецификации tho:

  • Содержит ли строка, с которой вы совпадаете, что-то еще, кроме этой?
  • Всегда ли есть два аргумента?
  • Являются ли аргументы только одним словом?
  • Является ли "функция" ключевым словом или именем функции?

Больше (реальных) примеров, пожалуйста!

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