Моя главная проблема связана с Java-вкусом, но я также ценю информацию о других.
Скажем, у вас есть подшаблон:
(.*)(.*)
Не очень полезно, как есть, но пусть эти две группы захвата (например, \1 и \2) являются частью более крупного шаблона, который соответствует обратным ссылкам этим группам и т.д.
Таким образом, оба жадные, поскольку они стараются захватить как можно больше, только принимая меньше, когда они должны.
Мой вопрос: кто жаднее? Возвращает ли \1 первостепенное значение, предоставляя \2 его долю только в том случае, если он должен?
Как насчет:
(.*)(.*)(.*)
Предположим, что \1 действительно имеет приоритет. Пусть говорят, что это слишком жадно, а потом выплевывает персонажа. Кто получает его первым? Всегда ли это \2 или может быть \3?
Предположим, что он \2, который получает отклонение \1. Если это все еще не сработает, кто выплевывает сейчас? Перемещает ли \2 на \3, или \1 сначала выплющает другое значение \2?
Бонусный вопрос
Что произойдет, если вы напишете что-то вроде этого:
(.*)(.*?)(.*)
Теперь \2 неохотно. Означает ли это, что \1 выскакивает до \3, а \2 только неохотно принимает отклонение \3?
Пример
Возможно, для меня было ошибкой не приводить конкретные примеры, чтобы показать, как я использую эти шаблоны, но вот некоторые из них:
System.out.println(
"OhMyGod=MyMyMyOhGodOhGodOhGod"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><My><God>"
// same pattern, different input string
System.out.println(
"OhMyGod=OhMyGodOhOhOh"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><MyGod><>"
// now \2 is reluctant
System.out.println(
"OhMyGod=OhMyGodOhOhOh"
.replaceAll("^(.*)(.*?)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><><MyGod>"