我有以下正则表达式:
^[a-zA-Z_][\-_a-zA-Z0-9]*
我需要将它的长度限制为39个字符。我尝试了以下但是没有用:
^[a-zA-Z_][\-_a-zA-Z0-9]*{,38}
答案 0 :(得分: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
input的作用。它使用^
计算字符串的开头,然后使用W
计算[a-zA-Z_]
,然后使用o
计算[-_a-zA-Z0-9]
。然后该组结束,这相当于匹配该组一次。由于我们可以匹配更多序列,因此正则表达式会尝试将r
与^
匹配。它失败。因此,下一个位置会以相同的方式重试并失败,因为d
不是^
(字符串的开头)。这样就可以匹配字符串的结尾,因为^[a-zA-Z_][-_a-zA-Z0-9]
出现了0次,并且字符串$
结束了。
请参阅regex demo
答案 1 :(得分:1)
试
^[a-zA-Z_][\-_a-zA-Z0-9]{0,38}$
[0,38]
表示匹配[\-_a-zA-Z0-9]
的字符实例数可以是0到38。
答案 2 :(得分: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)">