RegEx - нет последовательных пробелов - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь выполнить эти задачи через RegEx:

  1. Строка должна начинаться с алфавита.
  2. Строка может иметь максимальную длину 30 символов.
  3. Строка может содержать числа, алфавиты и пробел ().
  4. Строка может быть без учета регистра.
  5. Строка не должна иметь более одного пробела последовательно.
  6. Строка не может заканчиватьсяс пробелом.

После просмотра вики RegEx и других вопросов RegEx, у меня есть это выражение:

/^([A-Z])([A-Z0-9 ]){0,29}$/i

Хотя, это успешно выполняет задачу 1-4, я не могу найти что-либо в задачах 5 и 6.

Примечание: я использую Javascript для RegEx.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Строка не должна иметь более одного пробела последовательно.

При сопоставлении пробела, отрицательный взгляд на другое пробел.

Строка не может заканчиваться пробелом.

Также отрицательный прогноз конца строки при сопоставлении пробела:

/^([A-Z])([A-Z0-9]| (?! |$)){0,29}$/i
                  ^^^^^^^^^
0 голосов
/ 04 апреля 2019

Это регулярное выражение работает с Ruby. Я полагаю, что это будет и с Javascript.

r = /^(?!.{31})\p{Alpha}(?:\p{Alnum}| (?! ))*(?<! )$/

"The days of wine and 007"           =~ r  #=> 0   (a match)
"The days of wine and roses and 007" =~ r  #=> nil (too long)
"The days of  wine and 007"          =~ r  #=> nil (two consecutive spaces)
"The days of wine and 007!"          =~ r  #=> nil ('!' illegal)

Конструкции \p{} соответствуют символам Unicode.

Регулярное выражение может быть выражено следующим образом в свободном интервале (для документирования его составных частей).

/
^            # beginning of string anchor
(?!.{31})    # 31 characters do not follow (neg lookahead)
\p{Alpha}    # match a letter at beg of string
(?:          # begin a non-capture group
  \p{Alnum}  # match an alphanumeric character
  |          # or
  [ ]        # match a space
  (?![ ])    # a space does not follow (neg lookahead)
)*           # end non-capture group and execute >= 0 times
(?<![ ])     # a space cannot precede end of string (neg lookbehind)
$            # end of string anchor
/x           # free-spacing regex definition mode

Обратите внимание, что пробелы удаляются из регулярных выражений, определенных в режиме свободного пробела, поэтому пробелы, которые должны быть сохранены, должны быть защищены. Я поместил каждый в класс символов ([ ]), но также можно использовать \s (хотя это соответствует пробелам, символам табуляции, переводу строки и нескольким другим символам, что не должно быть проблемой).

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