Это регулярное выражение работает с 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
(хотя это соответствует пробелам, символам табуляции, переводу строки и нескольким другим символам, что не должно быть проблемой).