[Java] Что значит regexp "(a)\2"?

Sanjaz

сабж

gusli

Символы а и тот, у которого порядковый номер двойка - слитно

Sanjaz

А в доке сказано, что \2 - вторая группа.
Только я не понимаю, где в этом регекспе вторая группа?

Ivan8209

Это уже не РВ, а подстановка.
---
...Я работаю антинаучным аферистом...

sakura

Запости код функции, где используется этот regexp

evgen5555

Да нахера код функции нужен?
Пусть человек научится выделять регулярные выражения полностью — пригодится.

sakura

Да нахера код функции нужен?
У меня есть предположение, что '\2' - это остаток от применения другого регулярного выражения. Так в Perl'е можно использовать 2 регэкспа, а подстроки, находящиеся в скобочках будут сохраняться в специальные переменные $1, $2 и т.д.
$str_1 =  "abbb";
$str_1 =~ /(a+.+)/;

# here $1 = 'a', $2 = 'bbb'

$str_2 = "aaabbbbbbbb";

if($str_2 =~ /(a+)$2/)
{
# WE GO HERE
# here $1 = 'aaa', but $2 = 'bbb', as before
print "Match!";
}
else
{
print "Not Match!";
}

В Java же нет специальных переменных, вот я думаю, что там может результат предыдущего регэкспа сохраняется в \1, \2 и т.д.
Есть еще два варианта:
1. Авторо запостил только кусочек регэкспа, который ему не понятен
2. Это регулярное выражение вообще написано неправильно и не работает.
Когда будет код функции, то все должно стать ясно.

Svyatogor

Это зависит от того, как трактовать то, что написал автор.
Если автор имел в виду String s = "(a)\2"; s.mathes(...);, то ответ 'а совершенно верен.
Если же автор имел в виду значение строки (т.е. s="(a)\\2" то в данном случае наблюдаем небольшой "баг".
Для jdk 1.5 это действительно баг, в ней при разборе регулярного выражения не верно выполняется проверка "обратной ссылки" (back reference которой является \2. Как результат - допускается на 1 ссылку больше, чем положено (скорее всего, при проверке не учли, что начальное количество групп уже 1 стоит, а не 0). Т.е. "(a)\3" уже не допустимо, при его использовании получается исключение.
Для jdk 1.6 ситуация сложнее. Такое впечатление, что в ней вообще убрана проверка правильности обратных ссылок. Т.е. допустимы вообще любые значения, никаких исключений не возникает. (Например, допустимо выражение "(a)\9"). Почему такое поведение (специально или случайно) - пока не смотрел.

Sanjaz

Я написал регулярное выражение целиком.
В коде это выглядит так:
 Pattern.compile("\\2")  

Sanjaz

Согласен с , покапавшись в коде jdk1.5
Оставить комментарий
Имя или ник:
Комментарий: