Оптимизировать регулярное выражение

173
18 июля 2018, 01:40

Написал регулярку для такого условия: первая буква - заглавная русская, затем пробел, затем 6 цифр. Пример:

Г 666666

Регулярное выражение я записал следующим образом:

^[[А-Я]{1}[\\u0020]{1}[\\d]{6}]$

Требуется ли оптимизация данного регулярного выражения? И если да, то какая?

Answer 1

Выражение ^[[А-Я]{1}[\u0020]{1}[\d]{6}]$ находит только такую строку, которая состоит из одного символа (заглавной буквы, {, пробела, цифры, }), так как шаблон представляет собой неквантифицированный символьный класс со вложенными символьными классами (образуя так называемый "character class union", т.е. между этими символьными классами отношения типа ИЛИ), а квантификаторы тут распознаются как буквальные текст ([{6}] найдет {, 6 или }).

Вам нужно использовать

^[А-Я] \d{6}$

См. демо

Если под "пробелом" понимается любой пробельный символ, замените пробел в выражении \s и используйте флаг (?U) (тогда найдутся все пробелы Юникода):

(?U)^[А-Я]\s\d{6}$

Подробности

  • ^ - начало строки (в методе matches() его можно опустить, так как совпадение должно совпадать со всей строкой)
  • [А-Я] - русская заглавная буква
  • - пробел (можете его записать как \u0020, но это нужно только если вы планируете добавить в выражение комментарии с помощью флага Pattern.COMMENTS, хотя и тогда можно написать \, т.е. экранировать пробел)
  • \d{6} - 6 цифр (можно заменить на [0-9]{6})
  • $ - конец строки.

Java-код:

Boolean matched = s.matches("[А-Я] \\d{6}"); // Если в строке разрешается простой пробел
Boolean matched = s.matches("[А-Я]\\s\\d{6}"); // Если в строке разрешены любые пробельные символы
Answer 2

Квантификатор {1} можно не писать, поскольку по умолчанию и так проверяется единственное совпадение.

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

Результат: [A-Я]\s\d{6}.

Символы ^ и $ нужно добавить, если вы хотите убедиться, что строка целиком совпадает с шаблоном.

READ ALSO
Как правильно написать свойства wrapper-а?

Как правильно написать свойства wrapper-а?

Вопрос исключительно мучает меня 3 дня и только для профессионалов CSS этот вопрос очень важный для понимания как работает верстка так как...

208
Как сделать навигацию такого типа?

Как сделать навигацию такого типа?

Есть обычная навигация

259