Моя главная проблема связана с 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>"