如何限制字符串长度

3

我有以下正则表达式:

^[a-zA-Z_][\-_a-zA-Z0-9]*

我需要将其长度限制为39个字符。我尝试了以下方法,但它没有起作用:

^[a-zA-Z_][\-_a-zA-Z0-9]*{,38}

2
附注:[_a-zA-Z0-9]\w具有相同的覆盖范围,因此[\-_a-zA-Z0-9]可以替换为[-\w] - sp00m
1
如果这是在<input>上,请使用maxlength属性;如果这是字符串,您可以使用.length属性。 - Tushar
3个回答

3

您只需要使用限定符{0,38}和字符串结束锚点$:

^[a-zA-Z_][-_a-zA-Z0-9]{0,38}$
                       ^^^^^ ^

有限量词的语法为{min,max},其中max参数是可选的,但最小值应该存在。没有$,你可以在一个更长的字符串中匹配39个第一个字符。
当连字符位于字符类的开头时,您无需转义它(因此,建议删除它)。
此外,您可以使用/i修饰符进一步缩短正则表达式:
/^[a-z_][-_a-z0-9]{0,38}$/i

甚至更多。
/^[a-z_][-\w]{0,38}$/i

关于评论中的问题:

使用这个正则表达式 (^[a-zA-Z_][-_a-zA-Z0-9]){0,39}$,限制了39个字符,是否可行?

该正则表达式匹配:
  • (^[a-zA-Z_][-_a-zA-Z0-9]){0,39} - 0到39个序列...
    • ^ - 字符串开头
    • [a-zA-Z_] - 指定范围内的单个字符
    • [-_a-zA-Z0-9] - 指定范围内的单个字符
  • $ - 字符串结尾
所以,您需要在匹配中包括从字符串开头开始的序列。请注意,只能匹配一次字符串的开头。由于您允许此类序列的数量为0,因此您只匹配字符串末尾的位置或类似A-的2个字符字符串。
让我们看看正则表达式如何处理Word输入。它使用^匹配字符串开头,然后使用[a-zA-Z_]Wo[-_a-zA-Z0-9]匹配。然后该组结束,这等于仅匹配该组一次。由于我们可以匹配更多的序列,因此正则表达式尝试使用^r与其匹配。它失败了。因此,重新尝试下一个位置并以相同的方式失败,因为d不是^(字符串开头)。通过这种方式,字符串末尾被匹配,因为有0个^[a-zA-Z_][-_a-zA-Z0-9]出现,并且有字符串结尾$
请参见正则表达式演示

谢谢,那个版本 (^[a-zA-Z_][-_a-zA-Z0-9]){0,39}$ 也不会有问题吧?它限制了39个字符。 - Max Koretskyi
1
尝试使用regex101进行测试 - 不会成功,因为量词设置在以字符串开头为锚点的组上。 - Wiktor Stribiżew
谢谢,您能详细解释一下“量词设置为字符串开头所锚定的组”是什么意思吗? - Max Koretskyi

1
尝试
^[a-zA-Z_][\-_a-zA-Z0-9]{0,38}$

"

[0,38] 表示匹配 [\-_a-zA-Z0-9] 字符的实例数可以是 0 到 38。

"

0
我在这里添加一些内容,以防您限制输入字段的输入。
虽然不是正则表达式,但我使用这个函数,它运行良好(我会补充说明,从UI / UX角度让用户知道您正在限制输入长度非常重要):
limitLength: function(element, lengthOf){
    var fieldLength = element.value.length;
    if(fieldLength <= lengthOf){
        return true;
    } else {
        var str = element.value;
        str = str.substring(0, str.length - 1);
        element.value = str;
    }
}

使用方法:

<input type="text" onInput="my.namespace.limitLength(this,39)">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接