#regex
#регулярное выражение
Вопрос:
Я не знаю, почему я борюсь с этим простым регулярным выражением, но я борюсь 🙂
Мне нужно регулярное выражение, чтобы соответствовать строке:
- с разрешенными символами
[a-zA-Z0-9_.-]
- который содержит от 1 до 48 символов
- это может содержать точки, но не в конце строки
Перепробовал кучу регулярных выражений, но всегда есть что-то, что проскальзывает при сопоставлении. В итоге я получил
^([a-zA-Z0-9_.-]{1,48})([^.])$
По какой-то причине, test$
например, принимается как действительный. test$$
это не так.
Может ли кто-нибудь помочь мне встать на правильный путь здесь?
Ответ №1:
Вы можете использовать отрицательный lookbehind, если он поддерживается вашим механизмом регулярных выражений:
^[a-zA-Z0-9_.-]{1,48}(?<!.)$
Если ваш движок регулярных выражений не поддерживает отрицательные исходные данные, но поддерживает отрицательные исходные данные, то для вас будет работать следующее:
^(?!.*.$)[a-zA-Z0-9_.-]{1,48}$
Комментарии:
1. Спасибо, Улугбек! Похоже, что все мои проверки прошли, оба из них.
Ответ №2:
[^.]
завершает ваше регулярное выражение и будет соответствовать любому символу, кроме точки, так что вы фактически проверяете строку длиной от 2 до 49 символов, последняя из которых ничего, кроме .
.
Чтобы проверить свои критерии, вы можете использовать вместо:
^[a-zA-Z0-9_.-]{0,47}[a-zA-Z0-9_-]$
При этом учитывается, что последний класс символов «съедает» символ.
Комментарии:
1. Спасибо за быстрый ответ, Робин, это регулярное выражение, похоже, тоже работает.