Регулярное выражение для [a-zA-Z0-9 -] С разрешенными тире между ними, но не в начале или конце
обновление:
этот вопрос был эпическим провалом, но вот рабочее решение. Он основан на ответе Гамбо (Гамбо был близок к работе, поэтому я выбрал его в качестве принятого ответа):
устранение:
r'(?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$'
оригинальный вопрос (хотя, после 3 правок)
Я использую Python и я не пытается извлечь значение, но скорее тест, чтобы убедиться, что он соответствует шаблону.
разрешено значения:
spam123-spam-eggs-eggs1
spam123-eggs123
spam
1234
eggs123
не имеет значения:
eggs1-
-spam123
spam--spam
Я просто не могу иметь тире в начале или в конце. Есть вопрос здесь это работает в противоположном направлении, получая строковое значение после факта, но мне просто нужно проверить значение, чтобы я мог его запретить. Кроме того, это может быть максимум 25 символов длиной, а минимум 4 символа длиной. Кроме того, нет 2 тире может коснуться каждого другое.
вот что я придумал после некоторых экспериментов с lookbehind и т. д.:
# Nothing here
4 ответов
попробовать это регулярное выражение:
^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
это регулярное выражение позволяет дефисам разделять последовательности одного или нескольких символов [a-zA-Z0-9]
.
редактировать после вашего комментария: выражение (…)*
позволяет части внутри группы быть повторенным нул или больше времен. Это значит
a(bc)*
это то же самое, что
a|abc|abcbc|abcbcbc|abcbcbcbc|…
редактировать теперь, когда вы изменили требования: поскольку вы, вероятно, не хотите ограничивать каждую дефисную часть слов в ее длине, вам понадобится смотрим-впереди утверждение чтобы учесть длину:
(?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
текущее регулярное выражение является простым и довольно читаемым. Вместо того, чтобы делать его длинным и сложным, вы рассматривали применение других ограничений с помощью обычных инструментов обработки строк Python?
import re
def fits_pattern(string):
if (4 <= len(string) <= 25 and
"--" not in string and
not string.startswith("-") and
not string.endswith("-")):
return re.match(r"[a-zA-Z0-9\-]", string)
else:
return None
Это должно быть что-то вроде этого:
^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
вы говорите ему искать только один символ, либо a-z, A-Z, 0-9 или -, это то, что делает [].
Так если вы делаете [abc]
вы будете соответствовать только "a", или" b "или"c". не "abc"
получать удовольствие.
Если вы просто не хотите, тире в конце и начале, попробовать ^[^-].*?[^-]$
Edit: Ба, ты все время меняешь его.