我想不出能够满足所有这些要求的javascript正则表达式:

字符串只能包含下划线和字母数字字符。
它必须以字母开头,不包含空格,不以下划线结尾,并且不包含两个连续的下划线。

就我所知,但是'不包含连续的下划线这是最难添加的部分。

^[a-zA-Z][a-zA-Z0-9_]+[a-zA-Z0-9]$


评论

请告诉我这不是密码格式要求。

也许,您可以将其写为/^[A-Z](?!.*__)(?:\w*[A-Z0-9])?$/i

如果这是针对密码,请参阅参考-密码验证

#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)
});