Регулярное выражение для [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: Ба, ты все время меняешь его.