Подтвердить что ты не робот

Почему это регулярное выражение позволяет каретку?

http://regexr.com/3ars8

^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$

Должно совпадать "17 буквенно-цифровых символов, допустимые дефисы, должны содержать хотя бы одну букву и хотя бы одно число"

Он будет правильно соответствовать:

ABCDF31U100027743

и правильно отклониться:

AB$DF31U100027743

(и почти любой другой не-буквенно-цифровой char)

но, по-видимому, позволит:

AB^DF31U100027743
4b9b3361

Ответ 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.