2016-08-31 3 views
1

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

В основном я хочу, чтобы захватить картины как примеры ниже:

  1. {{переменной}}
  2. {{{variable.function1 param1}}}
  3. {{{variable.function1 param1 } .function2 {param2}}}

и так далее ..

Я хотел захватить переменную, function1, param1, function2, param2 из этого

До сих пор у меня есть ниже регулярное выражение, которое не работает полностью

\{\{([^{}.]+)(\.([^{}]+)\{([^{}]+)\})*\}\} 

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

  • Group # 1 - переменная
  • Group # 2 - .function2 {param2}
  • группа № 3 - function2
  • группа № 4 - param2

Я ожидал Somthing, как показано ниже,

  • группа № 1 - переменная
  • группа № 2 - .function1 {param1}
  • Группа №3 - функция1
  • Группа №4 - param1
  • Group # 5 - .function2 {param2}
  • Group # 6 - function2
  • Group # 7 - param2

PS: Вы можете проверить без написания кода на http://regexr.com/3e4st

+1

Я бы порекомендовал использовать https://regex101.com/ вместо этого, поскольку они действительно объясняют, почему он не делал то, что, по вашему мнению, он сделал бы (вам нужно было иметь скобки вокруг второй части, а также '((\. ([^ {}] +) \ {([^ {}] +) \}) *) 'vs' (\. ([^ {}] +) \ {([^ {}] +) \}) * ' ) Что касается фактического ответа, это все еще не правильно, поэтому я посмотрю, но никаких обещаний! –

+0

Спасибо @ A.lau, пожалуйста, дайте мне знать, если найдете, tx – Amit

ответ

1

Хорошо , поэтому причина, по которой ваша вещь не работает, заключается в том, что вы в основном собираете только один экземпляр вещи в целом, а это означает, что каждая группа захвата может возвращать только один экземпляр того, что вы хотите. Так что нужна глобальная переменная или ваш эквивалент на любом языке, который вы используете.

Пример: https://regex101.com/r/pO8xN2/3

+0

Спасибо, я пошел с таким подходом, чтобы захватить цепочки как каждый экземпляр и итерацию – Amit

1

Количество групп в матче регулярного выражения фиксируется. См. Раздел older post of mine с дополнительными пояснениями. В вашем случае это число равно 4.

Когда группа будет повторяться повторно, вы будете обычно сможет иметь доступ только к значению последнего вхождения в строку.Вот что вы видите в своей проблеме: function2, param2.

Некоторые двигатели регулярных выражений допускают доступ к предыдущим захватам группы (например, the one in .NET). Большинство нет. Независимо от того, можете ли вы легко решить свою проблему или нет, зависит от вашего двигателя регулярных выражений.

+0

Вы правы! Я не могу делать все групповые захваты за один раз. Однако, поскольку ответ А. Лау дал мне больше понимания в решении моей проблемы, я буду принимать этот ответ. Спасибо за ваш отзыв Tomalak. – Amit