2017-01-13 5 views
1

Это регулярное выражение, оценивается в .NETможет не совпадать скобки в регулярных выражениях группы

У меня есть следующий вход:

${guid->newguid()} 

И я хочу, чтобы произвести две соответствующих группы, последовательность символа после ${ и перед }, которые расщепленного ->:

  • Guid
  • newguid()

Узор я использую следующее:

([^(?<=\${)(.*?)(?=})->]+) 

Но это не соответствует скобки, я получаю только следующие матчи:

  • справ
  • newguid

Как я могу изменить тыс e regex, поэтому я получаю желаемые группы?

+2

Попробуйте ['\ $ {([^}] *?) -> ([^}] *)}'] (http://regexstorm.net/tester?p=%5c%24%7b%28 % 5b% 5e% 7d 5d% *% 3f% 29-% 3e% 28% 5b% 5e% 7d 5d% *% 29% 7d & я =% 24% 7bguid-% 3enewguid% 28% 29% 7d). –

+0

@ WiktorStribiżew спасибо, похоже, это работает. Я получаю совпадение, и у меня есть три группы: первая строка: $ {guid-> newguid()}, вторая: guid и третья: newguid() Упорядочить, пожалуйста, почему регулярное выражение, которое я ранее пробовал, ? Не предполагалось, что (. *) Соответствует всем событиям? – gdyrrahitis

+0

Вкратце: вы разрушили регулярное выражение, поместив последовательность шаблонов в класс отрицательных символов. –

ответ

1

Вашего регулярного выражения - ([^(?<=\${)(.*?)(?=})->]+) - кроме тех, которые определены в инверсном классе символов матч 1+ символы (то есть 1 или более символов, кроме (, ?, < и т.д.).

Я предлагаю использовать соответствующий регулярное выражение, как это:

\${([^}]*?)->([^}]*)} 

regex demo Посмотреть

Результаты, необходимые в match.Groups[1] и match.Groups[2]. Подробнее

Pattern:

  • \${ - матч ${ буквальное последовательность символов
  • ([^}]*?) - Группа 1 отлов 0+ символы, кроме } как можно
  • -> - последовательность буквальный символ ->
  • ([^}]*) - Группа 2, фиксирующая символы 0+, отличные от } как можно больше
  • } - буква }.

Если вы знаете, что у вас есть только слово символы внутри, вы можете упростить регулярное выражение для простого

\${(\w+)->(\w+\(\))} 

См regex demo. Однако он гораздо менее общий.

1

Ваша структура ввода всегда ${identifier->identifier()}? Если это так, вы можете использовать ^\$\{([^-]+)->([^}]+)\}$.

В противном случае, вы можете изменить ваш RegExpr к ([^?<=\${.*??=}\->]+): с помощью этого rexexpr вы должны соответствовать входной и получить нужные группы: uid и newguid(). Изменение ключа - это котировка - char, которая является intendend как range оператор без цитирования и заставляет вас вставлять скобки в ваш шаблон - но ... [^......(....)....] исключает скобки из матча.

Надеюсь, что может помочь!

EDIT: тестирование с https://regex101.com помог мне ... показать мне, что - было задумано как диапазона оператора.

+0

Этот символ * не * соответствует '$ {my-identifier-> identifier()}' – bradbury9

Смежные вопросы