Как избежать квадратной скобки для компиляции шаблона

StackOverflow https://stackoverflow.com/questions/1140268

Вопрос

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

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

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

Это было полезно?

Решение

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

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

public static String quote​(String s)

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

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

Метасимволам или управляющим последовательностям во входной последовательности не будет придано особого значения.

Другие советы

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

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

\\] 

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

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

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

\Q[0-9]\E

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top