Как написать регулярное выражение, соответствующее word_char, но только ноль или одно подчеркивание

У меня есть имя пользователя для проверки:

  1. состоит как минимум из 4 символов
  2. он может содержать только символ слова, цифру и подчеркивание (макс. один раз)
  3. он должен начинаться с символа слова и не может заканчиваться символом подчеркивания.

Я написал это регулярное выражение

^[a-zA-Z][^\W_]{2,}_?[a-zA-Z0-9]$

Но я действительно понятия не имею, как ограничить появление подчеркивания (0-1 раз).

Как я могу достичь своих требований?

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

mickmackusa 10.04.2022 05:44
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте просмотр вперед, чтобы проверить более конкретные квалификации, а затем примените общее правило \w{4,}.

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

const tests = ['_und', 'u_nd', 'un_d', 'und_', 'u_n_', 'u__d', '8_no'];
for (i in tests) {
    document.write(tests[i] + ' => ' + /^(?=[a-z][^_]*_?[^_]+$)\w{4,}$/i.test(tests[i]) + "<br>");
}
(?=         #lookahead
  [a-z]     #a letter
  [^_]*     #zero or more non-underscores
  _?        #an optional underscore
  [^_]+$    #one or more non-underscores until the end of the string
)

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

const tests = [
  'und',
  '_und',
  'u_nd',
  'un_d',
  'und_',
  'u_n_',
  'u__d',
  '8_no',
  'u_derscore',
  'un_erscore',
  'und_rscore',
  'unde_score',
  'under_co_e',
  'underscor_',
  '_nderscore'
];
for (i in tests) {
    document.write(tests[i] + ' => ' + /^[a-z](?:_[^\W_]{2,}|[^\W_]_[^\W_]+|[^\W_]{2,}_?[^\W_]+)$/i.test(tests[i]) + "<br>");
}

Авария:

/                        #pattern delimiter
^                        #start of string anchor
[a-z]                    #alphabetical character
(?:                      #non-capturing group
  _[^\W_]{2,}            #underscore, two or more alnum characters (at least 3 characters)
  |                      #or
  [^\W_]_[^\W_]+         #alnum character, underscore, one or more non-underscore (at least 3 characters)
  |                      #or
  [^\W_]{2,}_?[^\W_]+    #two or more alnum characters, optional underscore, one or more alnum characters (at least 3 characters)
)                        #end of non-capturing group
$                        #end of string anchor
/                        #pattern delimiter
i                        #case-insensitive pattern modifier

Ты спас мне жизнь. ХАХАХа, большое спасибо. Я даже не знаю, как использовать lookahead. Кстати, можно ли решить это без использования просмотра вперед?

Shotto 10.04.2022 08:34

но я думаю, может быть, лучше использовать [^\W_] для обозначения отсутствия подчеркивания лучше, чем [^_]? Потому что это может быть принято, если символ ., \ и т. д..

Shotto 10.04.2022 08:58

Упреждающий просмотр позволяет механизму регулярных выражений применять правила до фактического использования/сопоставления символов, а затем после того, как предварительный просмотр будет удовлетворен, механизм продолжит обход строки. Я обновляю свой ответ, чтобы включить шаблон без просмотра вперед, но он длиннее, и мне его труднее читать. Причина, по которой я использовал [^_] в первом фрагменте, заключалась в том, что \w{4,} применяла весь диапазон строковых символов.

mickmackusa 10.04.2022 11:03

Использование предпросмотра для обеспечения соблюдения правил надежности пароля очень распространено. Например: stackoverflow.com/a/43697894/2943403

mickmackusa 10.04.2022 11:27

Другие вопросы по теме