В Java и, кажется, на нескольких других языках, обратным следам в шаблоне предшествует обратная косая черта (например, \1
, \2
, \3
и т.д.), но в заменяющей строке им предшествует знак доллара (например, $1
, $2
, $3
, а также $0
).
Вот фрагмент, иллюстрирующий:
System.out.println(
"left-right".replaceAll("(.*)-(.*)", "\\2-\\1") // WRONG!!!
); // prints "2-1"
System.out.println(
"left-right".replaceAll("(.*)-(.*)", "$2-$1") // CORRECT!
); // prints "right-left"
System.out.println(
"You want million dollar?!?".replaceAll("(\\w*) dollar", "US\\$ $1")
); // prints "You want US$ million?!?"
System.out.println(
"You want million dollar?!?".replaceAll("(\\w*) dollar", "US$ \\1")
); // throws IllegalArgumentException: Illegal group reference
Вопросы:
- Используется ли
$
для обратных ссылок в строках замещения, уникальных для Java? Если нет, то какой язык начал? Какие ароматы используют его, а что нет? - Почему это хорошая идея? Почему бы не придерживаться одного и того же синтаксиса шаблонов? Разве это не привело бы к более сплоченному и более легкому изучению языка?
- Разве синтаксис не был бы более упорядоченным, если бы утверждения 1 и 4 в приведенных выше были "правильными" вместо 2 и 3?