Предельное повторение последовательности символов в слове - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над Angular веб-приложением. Выражение используется для проверки имени и фамилии.

Допустимые символы - буквы и "_", "-". Как ограничить повторение символов - и _ в слове? Мне нужно исключить повторения типа "А-а-а-а". Допускается:
- максимум 1 "-" символ и 1 знак подчеркивания,
- 2 "-" символов или 2 "_" символа, при этом они должны быть разделены не менее чем 3 буквами.

I иметь некоторое базовое c выражение, которое отлично работает, но не учитывает это:

^(?=.{3,15}$)(?![_-])(?!.*[_-]{2})[a-zA-Z_-]+(?<![_-])$
 └─────┬────┘└───┬──┘└─────┬─────┘└─────┬──┘ └───┬───┘
       │         │         │            │        no _ or - at the end
       │         │         │         allowed characters
       │         │       no __ or _- or -_ or -- inside
       │       no _ or - at the beginning
    name is 3-15 characters long

Примеры для передачи:

abcdef-xyz
abc-defxyz
abc-def
abc_def
abc-def-ghi
abc-def_ghi
abc_def_ghi

Примеры, которые не должны проходить:

_qwerty
qwerty_
-qwerty
qwerty-
asd--fff
zxc__cvb
sdf-_cvb
a-b
ab-c
ab-cd
abc-de
a-b-c-d
a_b_c_d
a-b-c_d

et c.

Спасибо!

Ответы [ 2 ]

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

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

^((?=[^-_]*-[^-_]{3,}-[^-_]*$)|(?=[^-_]*-[^-_]{3,}_[^-_]*$)|(?=[^-_]*_[^-_]{3,}-[^-_]*$)|(?=[^-_]*[-_][^-_]*$)|[^-_\n]+$)[\w-]*$

, которую мы сопоставляем с каждым [\w-]* (любым количеством слов, включая символы подчеркивания и да sh) с ограничениями, которые должны быть одним из:

(?=[^-_]*-[^-_]{3,}-[^-_]*$) две черты, по крайней мере, с 3 символами между

(?=[^-_]*-[^-_]{3,}_[^-_]*$) da sh и подчеркивание, по крайней мере, с 3 символами между

(?=[^-_]*_[^-_]{3,}-[^-_]*$) подчеркиванием и da sh не менее 3 символов между

(?=[^-_]*[-_][^-_]*$) только один da sh или подчеркивание

[^-_\n]+$ no da sh или подчеркивание

demo https://regex101.com/r/3MdB5Q/4

Как вы понимаете, при таком подходе вряд ли можно расширить другие ограничения, такие как "макс. 3 черточки". Причина в том, что регулярные выражения на самом деле не инструмент, когда вам нужно считать. Вы можете сделать это с помощью хитрости, но, как вы видите, это трудно расширить, а также читать для других разработчиков. Так что лучше воспользуйтесь некоторыми подсчетными функциями языка по вашему выбору.

0 голосов
/ 05 марта 2020

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

  • '_' и '-', когда они оба присутствуют в строке, должны быть разделены как минимум тремя символами, отличными от '_' и '-' (как требуется, если в строке присутствуют два '_' или два '-'); и
  • строка содержит не менее двух символов, чем '_' и '-'.

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

^(?=.{3,15}$)[^_-]{1,}(?:[_-]?(?:[^_-]{3,}[_-])?)?[^_-]{1,}$

Демонстрация

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

/
^              # match beginning of line
(?=.{3,15}$)   # match 3-15 chars followed by end-of-line
[^_-]{1,}      # match 1+ chars other than '_' and '-'
(?:            # begin a non-capture group
  [_-]?        # optionally match '_' or '-'
  (?:          # begin a non-capture group
    [^_-]{3,}  # match 3+ chars other than '_' and '-'
    [_-]       # match '_' or '-'
  )?           # end non-capture group
)?             # end non-capture group
[^_-]{1,}      # match 1+ chars other than '_' and '-'    
$              # match end of line
/x             # free-spacing regex definition mode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...