正则表达式-没有顺序空格

时间:2019-04-04 00:23:30

标签: javascript regex

我正试图通过RegEx完成这些任务:

  1. 字符串必须以字母开头。
  2. 字符串的最大长度为30个字符。
  3. 字符串可以包含数字,字母和空格()。
  4. 字符串可能不区分大小写。
  5. 字符串顺序应不超过一个空格。
  6. 字符串不能以空格结尾。

经过RegEx Wiki和其他RegEx问题后,我得到以下表达式:

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

尽管这成功完成了任务1-4,但我无法在任务5和6上找到任何东西。

注意:我正在将Javascript用于RegEx。

2 个答案:

答案 0 :(得分:3)

  

字符串顺序应不超过一个空格。

匹配空格时,负向查找另一个空格。

  

字符串不能以空格结尾。

匹配空格时,字符串末尾也为负值:

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

答案 1 :(得分:0)

此正则表达式适用于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(尽管它与空格,制表符,换行符和其他一些字符匹配,这应该没问题)