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

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

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

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

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

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

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

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

mickmackusa 10.04.2022 05:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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

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