字符串只能包含下划线和字母数字字符。
它必须以字母开头,不包含空格,不以下划线结尾,并且不包含两个连续的下划线。
就我所知,但是'不包含连续的下划线这是最难添加的部分。
^[a-zA-Z][a-zA-Z0-9_]+[a-zA-Z0-9]$
#1 楼
您可以使用多个前行(在这种情况下为负):^(?!.*__)(?!.*_$)[A-Za-z]\w*$
在regex101.com上观看演示。
分解为以下内容:
^ # start of the line
(?!.*__) # neg. lookahead, no two consecutive underscores (edit 5/31/20: removed extra Kleene star)
(?!.*_$) # not an underscore right at the end
[A-Za-z]\w* # letter, followed by 0+ alphanumeric characters
$ # the end
作为
JavaScript
片段: let strings = ['somestring', '_not_this_one', 'thisone_', 'neither this one', 'but_this_one', 'this__one_not', 'this_one__yes']
var re = /^(?!.*__)(?!.*_$)[A-Za-z]\w*$/;
strings.forEach(function(string) {
console.log(re.test(string));
});
请不要限制密码!
评论
那为什么 ??
–Exception_al
18年2月14日在14:00
看起来真棒。一个错误:'this_one__yes'<-此值不匹配,因为它包含2个连续的下划线
– Mariusz
18-2-14在14:04
#2 楼
您还可以使用^[a-zA-Z]([a-zA-Z0-9]|(_(?!_)))+[a-zA-Z0-9]$
演示
与正则表达式相比,唯一的变化是将
[a-zA-Z0-9_]
更改为[a-zA-Z0-9]|(_(?!_))
。我从字符集中删除了下划线,并在下一个字符的后面加上了下划线。如果(?!_)
为负向超前,表示_
不能为下一个字符评论
不适用于a或b或ab,请参阅regex101.com/r/QgbEYV/2(这意味着该字符串必须至少包含3个字符,如果不是必需的,则为dunno)。
– Jan
18-2-14在14:08
#3 楼
请参阅此处使用的正则表达式^[a-z](?!\w*__)(?:\w*[^\W_])?$
^
断言行的开头位置[a-z]
匹配任何行小写ASCII字母。下面的代码添加了i
(不区分大小写)标志,因此它也匹配大写变量。(?!\w*__)
负向超前确保在字符串中不存在两个下划线(?:\w*[^\W_])?
可选匹配以下\w*
匹配任意数量的单词字符[^\W_]
匹配_
以外的任何单词字符。解释:匹配不是单词字符但不匹配_
的所有内容(因为它在取反集中)。$
在行的末尾声明位置 let a = ['somestring', '_not_this_one', 'thisone_', 'neither this one', 'but_this_one', 'this__one_not', 'this_one__yes']
var r = /^[a-z](?!\w*__)(?:\w*[^\W_])?$/i
a.forEach(function(s) {
if(r.test(s)) console.log(s)
});
评论
请告诉我这不是密码格式要求。也许,您可以将其写为/^[A-Z](?!.*__)(?:\w*[A-Z0-9])?$/i
如果这是针对密码,请参阅参考-密码验证