Почему это регулярное выражение позволяет каретку?
http://regexr.com/3ars8
^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$
Должно совпадать "17 буквенно-цифровых символов, допустимые дефисы, должны содержать хотя бы одну букву и хотя бы одно число"
Он будет правильно соответствовать:
ABCDF31U100027743
и правильно отклониться:
AB$DF31U100027743
(и почти любой другой не-буквенно-цифровой char)
но, по-видимому, позволит:
AB^DF31U100027743
Ответы
Ответ 1
Поскольку ваш класс символов [A-z]
соответствует этому символу.
[A-z]
соответствует [
, \
, ]
, ^
, _
, `
и английским буквам.
Собственно, это распространенная ошибка. Вы должны использовать [a-zA-Z]
вместо того, чтобы разрешать только английские буквы.
Вот визуализация из Expresso, показывающая, что на самом деле охватывает диапазон [A-z]
:
![screenshot from Expresso showing the ASCII table, where you can see what the [A-z] range actually covers]()
Итак, это регулярное выражение (с опцией i
) не будет записывать вашу строку.
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
По-моему, всегда безопаснее использовать параметр Ignorecase
, чтобы избежать такой проблемы и сократить регулярное выражение.
Ответ 2
regex использует ASCII печатные символы из пространства в диапазон тильды.
Всякий раз, когда мы используем маркер [A-z]
, он соответствует следующей таблице выделенных символов. Если мы используем маркер [ -~]
, он будет начинаться с SPACE
до тильды.
![введите описание изображения здесь]()
Ответ 3
Вы разрешаете A-z (капитал "A" через нижний "z" ). Вы не говорите, какой пакет регулярных выражений вы используете, но не обязательно ясно, что A-Z и a-z смежны; между ними могут быть другие символы. Вместо этого попробуйте:
^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$
Кажется, я отвечаю вашим критериям для меня в regexpal.