Ошибка в регулярном выражении, когда первый символ \ работает нормально с любым другим символом - PullRequest
0 голосов
/ 22 сентября 2011

Для проекта, который я делаю, мне нужно прочитать строку.Эта строка может содержать одно или несколько шестнадцатеричных представлений символов Юникода (например, "\ u0161" для "š").Я хочу преобразовать эти коды в правильное представление символов.

. Для этого мне сначала нужно обнаружить, что в моей строке есть шестнадцатеричная последовательность формата "\ uAAAA", и поэтому я написал следующеерегулярное выражение:

Pattern classPattern = Pattern.compile("\\u[0-9a-fA-F]{4}");
Matcher classMatcher = classPattern.matcher("\\u1ECD");
System.out.println(classMatcher.find());

К сожалению, это приводит к ошибке «java.util.regex.PatternSyntaxException: недопустимая escape-последовательность Unicode рядом с индексом 2».

Однако, если я заменю «\»просто для целей тестирования с помощью символа "@" регулярное выражение работает, как и ожидалось:

Pattern classPattern = Pattern.compile("@u[0-9a-fA-F]{4}");
Matcher classMatcher = classPattern.matcher("@u1ECD");
System.out.println(classMatcher.find());

Это наводит меня на мысль, что я делаю что-то не так с обратной косой чертой.Я пробовал также много других последовательностей, но ни одна из них не работала.Пожалуйста, помогите.

1 Ответ

3 голосов
/ 22 сентября 2011

«\ u» имеет особое значение в мире регулярных выражений Java, а именно вокруг сопоставления с реальными символами Юникода. Вы должны дважды экранировать \, чтобы получить желаемое совпадение.

Pattern classPattern = Pattern.compile("\\\\u[0-9a-fA-F]{4}");

[обновление] Как отмечалось в комментариях, мои аргументы в пользу правильного ответа были ошибочными.

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