Добавление ваших конкретных примеров кардинально меняет природу вопроса. Он все еще начинается, как я описал в моем первом ответе, с первой (.*)
, сжигающей все символы, и второй и третьей группам, позволяющей ему иметь их, но затем он должен совпадать со знаком равенства.
Очевидно, что в конце строки нет ни одного, поэтому группа # 1 возвращает символы один за другим, пока =
в регулярном выражении не совпадет с =
в цели. Затем движок регулярных выражений пытается найти соответствие (\1|\2|\3)+$
, и начинается настоящее веселье.
Группа 1 отказывается от d
, а группа 2 (которая все еще пуста) берет его, но остальная часть регулярного выражения по-прежнему не может соответствовать. Группа 1 отказывается от совпадений o
и группы 2 od
, но остальная часть регулярного выражения по-прежнему не может соответствовать. И так далее, с вовлечением третьей группы, и все трое всячески разделяют входные данные, пока не будет достигнуто полное соответствие. RegexBuddy сообщает, что для этого требуется 13 426 шагов.
В первом примере жадность (или ее отсутствие) на самом деле не является фактором; единственный способ достичь совпадения - это если слова Oh
, My
и God
объединяются в отдельные группы, так что в конечном итоге это и происходит. Даже не имеет значения, какая группа запомнит, какое слово - это просто первым пришел, первым обслужен, как я уже говорил.
Во втором и третьем примерах необходимо разбить префикс только на две части: Oh
и MyGod
. Группа 2 захватывает MyGod
во втором примере, потому что она следующая в очереди и она жадная, как в первом примере. В третьем примере каждый раз, когда группа 1 отбрасывает персонажа, группа 2 (неохотно) позволяет группе 3 взять его вместо себя, так что это тот, который в конечном итоге обладает MyGod
.
Это, конечно, сложнее (и утомительнее), но я надеюсь, что это ответит на ваш вопрос. И я должен сказать, что вы выбрали интересную целевую строку; если бы у движка регулярных выражений был оргазм, я думаю, что именно эти регулярные выражения могли бы его вызвать. : D