Можно ли упростить это регулярное выражение? Желаемый шаблон — это слова с прописными буквами

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть следующее регулярное выражение JavaScript. Мне интересно, есть ли способ упростить или улучшить его.

Вот мое существующее регулярное выражение, которое не проверяет наличие новых строк или начало строки:

 /([^0-9a-z =%$#?!amp;<>;()@* -,./{}^[]\] )$/
 

Вот что я пробовал, поскольку слова состоят только из букв и символов подчеркивания, но в нем говорится, что новые строки допустимы, как и специальные символы.

 /bw[^a-z0-9n] b/
 

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

Допустимый ввод будет:

 ERIS_TEST_GROUP_NAME
JENNIFER_AD_GROUP_NAME
PSEUDO_TEST_TEAM
TEST_GROUP
 

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

     _JEN_TEST_GROUP
    234*((_amp;amp;*^
    ab^*(_EWRR)
    e_RERE_^amp;)(*$#$#@()\
 

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

1. Может быть: /^[A-Z] (?:_[A-Z] )*$/

2. «Слова с верхним регистром» -> это допустимо? wordWithuppercase

3. В моей ситуации регистр верблюда недопустим. Похоже, шаблон @anubhava довольно близок к тому, что мне нужно.

4. ERIS_TEST_GROUP_NAME_ Допустимо?

5. Если я правильно понял, я попробовал /^[A-Z] ?_([A-Z] ?_)*[A-Z] ?$/, в котором вы можете увидеть, чему он соответствует, а чему нет regex101.com/r/RDrph9/1

Ответ №1:

То, что у вас было близко,

w соответствует только одному символу.

Если вы хотите сопоставить более одного, вы можете сделать это с помощью ‘ ‘

 /bw [^a-z0-9n] b/
 

[A-Z] будет соответствовать более чем одному символу верхнего регистра

итак, вы могли бы попробовать что-то вроде этого:

 /b[A-Z] (_[A-Z] )*b/
 

Ответ №2:

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

 ^(?=.)(?:n?[A-Z] (?:_[A-Z] )*) $
 

Смотрите онлайн-демонстрацию

  • ^ — Начать привязку строки.
  • (?=.) — Позитивный взгляд на символ, отличный от новой строки.
  • (?: — Откройте 1-ю группу без захвата.
    • n? — Необязательный символ новой строки.
    • [A-Z] — Любая заглавная буква альфа хотя бы один раз.
    • (?: — Откройте 2-ю группу без захвата.
      • _[A-Z] — Подчеркивание, за которым следует хотя бы одна заглавная буква.
      • )* — Закройте 2-ю группу без захвата и сопоставьте ее с нулем или более.
    • ) — Закройте 1-ю группу захвата и сопоставьте ее хотя бы один раз.
  • $ — Конец струнного якоря.

А если нет, то я думаю, вам следует выбрать вариант, упомянутый в комментариях @Anubhava

Ответ №3:

Используйте

 ^[A-Z] (?:_[A-Z] )*(?:n[A-Z] (?:_[A-Z] )*)*$
 

Смотрите Доказательство

Объяснение:

 --------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [A-Z]                    any character of: 'A' to 'Z' (1 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    _                        '_'
--------------------------------------------------------------------------------
    [A-Z]                    any character of: 'A' to 'Z' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )*                       end of grouping
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    n                       'n' (newline)
--------------------------------------------------------------------------------
    [A-Z]                    any character of: 'A' to 'Z' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      _                        '_'
--------------------------------------------------------------------------------
      [A-Z]                    any character of: 'A' to 'Z' (1 or
                               more times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )*                       end of grouping
--------------------------------------------------------------------------------
  )*                       end of grouping
--------------------------------------------------------------------------------
  $                        before an optional n, and the end of the
                           string