Недопустимая ошибка escape-символа в регулярном выражении Java - PullRequest
2 голосов
/ 16 ноября 2011

Я прочитал руководство , и в конце было упражнение:

Используйте обратную ссылку, чтобы написать выражение, которое будет соответствовать имени человека, только если его имя и фамилия совпадают.

Я написал следующую программу http://pastebin.com/YkuUuP5M
Но когда я его компилирую, я получаю сообщение об ошибке:

PersonName.java:18: illegal escape character
p = Pattern.compile("([A-Z][a-zA-Z]+)\s+\1");
                                      ^

Если переписать 18 строк таким образом:

pattern = Pattern.compile(console.readLine("%nEnter your regex: "));

и напишите шаблон в консоли, тогда программа работает нормально. Почему я не могу использовать шаблон, как в первом случае программы, и есть ли способ его исправить?

1 Ответ

7 голосов
/ 16 ноября 2011

Вы хотите получить этот текст в строку:

([A-Z][a-zA-Z]+)\s+\1

Однако \ в строковом литерале в исходном коде Java - это символ, используемый для экранирования (например, "\ t "для вкладки).Поэтому вам нужно использовать «\» в строковом литерале, чтобы в результате получить одну обратную косую черту в результирующей строке.Итак, вы хотите:

"([A-Z][a-zA-Z]+)\\s+\\1"

Обратите внимание, что для этого нет ничего специфичного для регулярных выражений. В любое время, когда вы хотите выразить строку, содержащую обратную косую черту, в строковом литерале Java, вам необходимо экранировать эту обратную косую черту.Регулярные выражения и имена файлов Windows - это наиболее распространенные случаи для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...