关于javascript:有没有更好的方法来编写与前导和尾随空格不匹配的正则表达式以及字符限制?

Is there a better way to write a regex that does not match on leading and trailing spaces along with a character limit?

我的瑞格鞋是…

1
^[A-z0-9]*[A-z0-9\s]{0,20}[A-z0-9]*$

此regex的最终目标是不允许使用前导空格和尾随空格,同时将输入的字符限制为20,而上面的regex在这方面做得不好。

我发现了一些类似的问题,最接近的问题是如何用regex验证用户名?但它没有限制字符数。这确实解决了前导和尾随空间的问题。

我也看到了一种使用否定和另一种消极展望的方法,但这对我来说不是很好。

有没有更好的方法可以用20个字符的限制来写上面的regex?允许的字符的重复非常难看,尤其是当允许的字符列表较大且特定时。


更新:

我更喜欢这个。我们使用负向前看来确保字符串末尾没有^\s(字符串开头的空白)或\s$空白。然后匹配1个字母数字字符。我们重复1-20次。

1
/^(?:(?!^\s|\s$)[a-z0-9\s]){1,20}$/i

演示

1
2
3
4
5
6
7
8
9
10
^            (?# beginning of string)
(?:          (?# non-capture group for repetition)
  (?!        (?# begin negative lookahead)
    ^\s      (?# whitespace at beginning of string)
   |         (?# OR)
    \s$      (?# whitespace at end of string)
  )          (?# end negative lookahead)
  [a-z0-9\s] (?# match one alphanumeric/whitespace character)
){1,20}      (?# repeat this process 1-20 times)
$            (?# end of string)

初始:

我在字符串的开头((?!...))使用了一个负向前视,以确保我们不会从空白开始。然后我们检查0-19个字母数字(由于i修饰符不区分大小写)或空白字符。最后,我们确保以纯字母数字字符(没有空格)结尾,因为我们不能在javascript中使用lookbehind。

1
/^(?!\s)[a-z0-9\s]{0,19}[a-z0-9]$/i


嗯,如果您需要排除单个字符的文本,我将使用:

1
^[A-z0-9][A-z0-9\s]{0,18}[A-z0-9]$

如果一个字符也可以接受:

1
^[A-z0-9](?:[A-z0-9\s]{0,18}[A-z0-9])?$


使用此模式^(?!\s).{0,20}(?

  • ^(?!\s)行首看不到空格
  • .{0,20}后接0到20个字符
  • (?以非空格字符结尾

演示

或者这个模式^(\S.{0,18}\S)?$。演示


\S匹配非空白字符。因此,这应该与您要查找的内容相匹配:

^\S.{0,18}\S$

也就是说,一个非空格字符\S,后面跟着18个任意类型的字符.(空格与否),最后是一个非空格字符。

上述regex的唯一限制是该值必须至少为2个字符。如果需要允许1个字符,可以使用:

^\S(.{0,18}\S)?$

如果您希望验证用户名(如您所暗示的,但没有明确声明),那么您可能希望只允许数字、字母和下划线。在这种情况下,^\w{1,20}$就足够了。


  • 我认为您的regex将输入限制为22个字符,而不是20个字符。
  • 您知道字符范围[a-z]包括字符[\]^_`吗?
  • 我想我会这样做:

    1
    2
    3
    4
    5
    input = input.trim().replace(/\s+/, ' ');
    if (input.length > MAX_INPUT_LENGTH ||
        ! /^[a-z ]+$/i.match(input) ) {
      # raise exception?
    }