[Java] Что значит regexp "(a)\2"?
Символы а и тот, у которого порядковый номер двойка - слитно
Только я не понимаю, где в этом регекспе вторая группа?
---
...Я работаю антинаучным аферистом...
Запости код функции, где используется этот regexp
Пусть человек научится выделять регулярные выражения полностью — пригодится.
Да нахера код функции нужен?У меня есть предположение, что '\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. Это регулярное выражение вообще написано неправильно и не работает.
Когда будет код функции, то все должно стать ясно.
Если автор имел в виду 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"). Почему такое поведение (специально или случайно) - пока не смотрел.
В коде это выглядит так:
Pattern.compile("\\2")
Согласен с , покапавшись в коде jdk1.5
Оставить комментарий
Sanjaz
сабж