RegEx - Поиск нескольких тире во всей строке ... и немного больше - PullRequest
3 голосов
/ 07 марта 2020

Так что я УЖАСНО с RegEx ... можете ли вы помочь мне со следующим?

  • разрешает только 52 всего символов
  • имеет только "az", "AZ", «0-9», & «-» (буквы, цифры и тире)
  • не начинается с «-» (da sh)
  • не заканчивается на «-» (da sh)
  • не имеет "-" (две последовательные черты вместе)
  • не имеет более 2 "-" (тире) во всей строке (это с чем у меня проблемы)

Итак, вот полезный список (я полагаю):

Pass:
    abc-123
    abc-123-abc
Fail: 
    -abc-123             (fails due to starting with a dash)
    abc-123-             (fails due to ending with a dash)
    abc-123-abc-123      (fails due to 3 dashes)
    abc-12#-abc          (failed due to having a character that is not a-z, A-Z, 0-9, or a dash)

Это то, что у меня сейчас есть, но вы можете сменить его однако вы хотели бы:

(?!.*--)^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,50}[a-zA-Z0-9])?$

Я уверен, что есть лучший способ сделать это, но, как уже упоминалось выше, я ужасен с выражениями. Мое выражение работает, оно не находит больше двух штрихов.

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Вы можете использовать assert максимум 52 символа в положительном прогнозе.

Затем сопоставить 1 или более раз [a-zA-Z0-9]+ и повторить 0, 1 или 2 раза или более того же шаблона, которому предшествует -

^(?=[a-zA-Z0-9-]{1,52}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+){0,2}$

Пояснение

  • ^ Начало строки
  • (?= Положительный взгляд вперед, подтвердите, что на право равно
    • [a-zA-Z0-9-]{1,52}$ Совпадение с любым из перечисленных 1-52 раз и подтверждение конца строки
  • ) Закрыть взгляд вперед
  • [a-zA-Z0-9]+ Совпадение 1+ раз с любым из перечисленных, чтобы предотвратить совпадение с пустой строкой
  • (?: Без захвата группы
    • -[a-zA-Z0-9]+ Совпадение - и 1+ раз с любым из перечисленных без -
  • ){0,2} Закрыть группу и повторить 0-2 раза
  • $ Конец строки

Regex demo

1 голос
/ 07 марта 2020

Вы можете использовать следующее PCRE регулярное выражение со вкусом:

/^(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)$/gmi

Демо

Регулярное выражение можно сделать самодокументирующим запись в режиме свободного пробега :

/
^                    # match beginning of line
(?!.*\-\-.*$)        # the line may not contain two consecutive hyphens
(?!.*\-.*\-.*\-.*$)  # the line may not contain more than two hyphens
(?!-)                # the first char cannot be a hyphen               
[a-z0-9-]{0,52}      # match 0-52 letters, digits and hyphens
(?<!-)               # the last char cannot be a hyphen
$                    # match end of the line
/xgmi                # free-spacing, global, multiline, case indifferent modes

(?!.*\-\-.*$), (?!.*\-.*\-.*\-.*$) и (?!-) являются отрицательными взглядами ; (?<!-) - это негативный вид сзади .

Соответствует каждой строке строки (удобно для демонстрации тестовых примеров в demo ). Если строка содержит одну строку, регулярное выражение может быть несколько упрощено:

\A(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)\z

Не то, чтобы \A и \z начинались и заканчивались якорями строки, тогда как ^ и $ начинаются и конец якоря линии. Сравните отрицательные точки зрения в этом регулярном выражении с теми в предыдущем.

Если это имеет значение, это соответствует пустым строкам.

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