Регулярное выражение: белый список символов максимальная длина нет точки в конце

#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. Спасибо за быстрый ответ, Робин, это регулярное выражение, похоже, тоже работает.