Регулярное выражение для [a-zA-Z0-9 \ -] с разрешенными тире между, но не в начале или в конце - PullRequest
9 голосов
/ 26 марта 2010

Обновление:

Этот вопрос был грандиозным провалом, но вот рабочее решение. Он основан на ответе Гамбо (Гамбо был близок к работе, поэтому я выбрал его в качестве принятого ответа):

Решение:

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 ]

16 голосов
/ 26 марта 2010

Попробуйте это регулярное выражение:

^[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]+)*$
4 голосов
/ 26 марта 2010

Текущее регулярное выражение простое и достаточно читаемое. Вместо того, чтобы сделать его длинным и сложным, рассматривали ли вы возможность применения других ограничений с помощью обычных инструментов обработки строк 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
2 голосов
/ 26 марта 2010

Это должно быть примерно так:

^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$

Вы говорите ему искать только один символ, a-z, A-Z, 0-9 или -, это то, что делает [].

Так что если вы сделаете [abc], вы будете соответствовать только "a", или "b" или "c". не "abc"

Веселись.

0 голосов
/ 26 марта 2010

Если вы просто не хотите тире в конце и в начале, попробуйте ^[^-].*?[^-]$

Редактировать: Бах, ты продолжаешь его менять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...