Ошибка регулярного выражения Java: \ (недопустимый символ - PullRequest
4 голосов
/ 10 марта 2011

Сегодня я использовал регулярное выражение Java и обнаружил, что вам запрещено использовать следующую последовательность регулярных выражений

String pattern = "[a-zA-Z\\s\\.-\\)\\(]*";

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

Но если я изменю регулярное выражение на

String pattern = "[[a-zA-Z\\s\\.-]|[\\(\\)]]*";

Тогда это будет работать. Это ошибка в движке regxp или я не понимаю, как работать с двигателем?

РЕДАКТИРОВАТЬ: У меня была ошибка в моей строке: не должно быть 2, начиная [[, это должен быть только один. Это теперь исправлено

Ответы [ 4 ]

9 голосов
/ 10 марта 2011

У вашего регулярного выражения есть две проблемы.

  1. Вы не закрыли класс символов.

  2. - действует какоператор диапазона с . на LHS и ( на RHS.Но ( предшествует . в юникоде, поэтому это приводит к недопустимому диапазону.

Чтобы исправить проблему 1, закройте класс char или если вы не хотите включать [ в разрешенных символах удалите один из [.

Чтобы решить проблему 2, либо экранируйте - как \\- или переместите - в начало или конец символакласс.

Таким образом, вы можете использовать:

String pattern = "[a-zA-Z\\s\\.\\-\\)\\(]*";

или

String pattern = "[a-zA-Z\\s\\.\\)\\(-]*";

или

String pattern = "[-a-zA-Z\\s\\.\\)\\(]*";
5 голосов
/ 10 марта 2011

Вы должны использовать только черту - в конце класса символов, так как он обычно используется для отображения диапазона (как в a-z). Переставь это:

String pattern = "[[a-zA-Z\\s\\.\\)\\(-]*";

Кроме того, я не думаю, что вам нужно экранировать (.) символов в скобках.

Обновление : Как отмечали другие, вы также должны экранировать [ в классе символов Java Regex.

2 голосов
/ 10 марта 2011

Проблема здесь в том, что \.-\) ("\\.-\\)" в строковом литерале Java) пытается определить диапазон от . до ). Поскольку кодовая точка Unicode . (U + 002E) выше, чем ) (U + 0029), это ошибка.

Попробуйте использовать этот шаблон, и вы увидите: [z-a].

Правильным решением является либо поставить тире - в конце группы символов (в этот момент он потеряет свое особое значение), либо избежать его.

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

Кроме того, экранирование . не требуется в группе символов.

1 голос
/ 10 марта 2011

Вы должны выйти из тире и закрыть непревзойденную квадратную скобку. Таким образом, вы получите две ошибки с этим регулярным выражением:

java.util.regex.PatternSyntaxException: Illegal character range near index 14

потому что тире используется для указания диапазона, а \), очевидно, является недопустимым символом диапазона. Если вы избежите черты, сделав ее [[a-zA-Z\s\.\-\)\(]*, вы получите

java.util.regex.PatternSyntaxException: Unclosed character class near index 19

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

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