Используя lookahead, как убедиться, что включено не менее 4 буквенно-цифровых символов подчеркивания

#javascript #regex

Вопрос:

Я пытаюсь убедиться, что во входные данные включено не менее 4 буквенно-цифровых символов, а также что подчеркивания также разрешены.

Учебник по регулярным выражениям немного выше моего понимания, потому что в нем говорится об утверждениях и успехе/неудаче, если есть совпадение.

 ^w*(?=[a-zA-Z0-9]{4})$
 

мое понимание:

w —> буквенно-цифровой подчеркивание

* —> соответствует предыдущему маркеру от нуля до неограниченного количества раз ( таким образом, это означает, что это может быть любой символ, который является буквенно-цифровым/подчеркиванием, правильно?)

(?=[a-zA-Z0-9]{4}) —> опережает предыдущие символы, и если они включают по крайней мере 4 буквенно-цифровых символа, то я в порядке.

Очевидно, я ошибаюсь на этот счет, потому что regex101 не показывает мне совпадений.

Комментарии:

1. ^[a-zA-Z0-9_]{4,}$ — ввод представляет собой строку из 4 или более символов, каждый из которых является буквой, цифрой или подчеркиванием? [a-zA-Z0-9_]{4,} — ввод содержит последовательность из 4 или более символов, каждый из которых является буквой, цифрой или подчеркиванием?

2. @DmitryBychenko привет, спасибо, что нашли время.. я хочу убедиться, что входные данные не окажутся чем-то вроде ___h8 , но будут иметь что-то вроде hello99____

3. Итак, ввод должен начинаться с буквы и содержать не менее 3 символов, каждый из которых является буквой, цифрой или символом подчеркивания? ^[a-zA-Z][a-zA-Z0-9_]{3,}$ ?

4. @DmitryBychenko мне все равно, с чего это начинается или заканчивается, оно может быть как можно длиннее, но я бы хотел, чтобы их было не менее 4 alphanumerics..so это позволяет предположить, что всего 6 символов, только 2 из них могут быть подчеркиванием

5. Вы можете попробовать атомарные группы: ^(?>_*[a-zA-Z0-9]_*){4}[a-zA-Z0-9_]*$ : мы гарантируем, что 4 фрагмента, каждый из которых содержит 1 букву или цифру

Ответ №1:

Вам нужно 4 или более буквенно-цифровых символа, окруженных любым количеством знаков подчеркивания (используйте ^ и $ , чтобы убедиться, что они соответствуют всему вводу).:

 ^(_*[a-zA-Z0-9]_*){4,}$
 

Комментарии:

1. Пожалуйста, добавьте якоря : ^ и $ ; в противном случае !!!!!abcd!!!!! и будут совпадать

Ответ №2:

Ваш шаблон ^w*(?=[a-zA-Z0-9]{4})$ не совпадает, потому что:

  • ^w* Сопоставляет необязательные символы слов с начала строки, и если есть только символы слов, они будут совпадать до конца строки
  • (?=[a-zA-Z0-9]{4}) Положительный внешний вид является истинным, если он может утверждать 4 последовательных буквенно-цифровых символа справа от текущей позиции. w* Позволяет отследить и может отследить 4 позиции, чтобы утверждение было истинным.
  • Но $ утверждает конец строки, которому он не может соответствовать, так как позиция переместилась на 4 шага влево, чтобы выполнить предыдущее положительное утверждение lookahead.

Используя внешний вид, вы можете указать 4 буквенно-цифровых символа, которым предшествуют необязательные символы подчеркивания.

Если утверждение верно, сопоставьте 1 или более символов слова.

 ^(?=(?:_*[a-zA-Z0-9]){4})w $
 

Шаблон совпадает:

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

Демонстрация регулярных выражений

Комментарии:

1. спасибо, что уделили время, сработало бы следующее по крайней мере для 4 буквенно-цифровых символов и любого подчеркивания ИЛИ числа: /^(?:_*[0-9]*[A-Za-z][0-9]*_*){4,}$/ я пытался сделать это с помощью логики ur, надеюсь, это сработает

Ответ №3:

Я предлагаю использовать атомарные группы (?>...) , пожалуйста, смотрите учебник по регулярным выражениям для получения подробной информации

  ^(?>_*[a-zA-Z0-9]_*){4,}$
 

чтобы обеспечить 4 или более фрагментов, каждый из которых содержит букву или цифру.

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

   ^(?:_*[A-Za-z0-9]_*){4,}$