正则表达式不包含连续字符

时间:2018-02-14 13:55:15

标签: javascript regex

我无法找出满足所有这些要求的javascript正则表达式:

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

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

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

3 个答案:

答案 0 :(得分:6)

您可以使用多个前瞻(在这种情况下为neg。):

^(?!.*__)(?!.*_$)[A-Za-z]\w*$

a demo on regex101.com

<小时/> 细分说明:

^           # start of the line
(?!.**__)   # neg. lookahead, no two consecutive underscores
(?!.*_$)    # 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));
});

请不要限制密码!

答案 1 :(得分:3)

您也可以使用

^[a-zA-Z]([a-zA-Z0-9]|(_(?!_)))+[a-zA-Z0-9]$

Demo

与正则表达式相比,唯一的变化是将[a-zA-Z0-9_]更改为[a-zA-Z0-9]|(_(?!_))。我从字符集中删除了下划线,如果它没有跟随另一个,则允许它在替代的第二部分。

(?!_)是负面预测意味着_不能成为下一个字符

答案 2 :(得分:1)

See regex in use here

^[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)
});