Как избежать квадратной скобки для компиляции Pattern - PullRequest
24 голосов
/ 17 июля 2009

У меня список разделенных запятыми регулярных выражений:

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]

Я разделил запятую. Теперь я пытаюсь сопоставить это регулярное выражение с сгенерированным паролем. Проблема в том, что Pattern.compile не любит квадратные скобки, которые не экранированы. Кто-нибудь может дать мне простую функцию, которая принимает строку вроде: [0-9] и возвращает экранированную строку \[0-9\].

Ответы [ 4 ]

32 голосов
/ 29 июля 2015

По какой-то причине приведенный выше ответ не сработал для меня. Для таких, как я, которые приходят после, вот что я нашел.

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

\\] 

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

Если вы, например, пытаетесь сопоставить символ новой строки, вы должны использовать только одну обратную косую черту. Вы используете шаблон escape-строки для вставки символа новой строки в строку. Регекс не видит \n - он видит символ новой строки и соответствует ему. Вам нужны две обратные косые черты, потому что это не escape-последовательность строк, это escape-последовательность regex.

23 голосов
/ 17 июля 2009

Вы можете использовать Pattern.quote(String).

Из документов:

public static String quote​(String s)

Возвращает буквенный шаблон String для указанного String.

Этот метод создает строку, которую можно использовать для создания шаблона, который будет соответствовать строке s, как если бы это был буквальный шаблон.

Метасимволы или escape-последовательности во входной последовательности не будут иметь специального значения.

12 голосов
/ 17 июля 2009

Можно использовать специальные символы \ Q и \ E ... все, что находится между \ Q и \ E, автоматически экранируется.

\Q[0-9]\E
3 голосов
/ 18 июля 2009

Pattern.compile() любит квадратные скобки просто отлично. Если вы берете строку

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"

и разделив его на запятые, вы получите пять совершенно правильных регулярных выражений: первое соответствует восьми символам, не являющимся разделителями строк, второе соответствует цифре ASCII и т. Если вы действительно не хотите сопоставлять строки типа ".{8}" и "[0-9]", я не понимаю, почему вам нужно что-либо избегать.

...