I can't figure out javascript regex that would satisfy all those requirements:
The string can only contain underscores and alphanumeric characters. It must begin with a letter, not include spaces, not end with an underscore, and not contain two consecutive underscores.
This is as far as I came, but 'not containing consecutive underscores' part is the hardest to add.
^[a-zA-Z][a-zA-Z0-9_]+[a-zA-Z0-9]$
                You could use multiple lookaheads (neg. ones in this case):
^(?!.*__)(?!.*_$)[A-Za-z]\w*$
See a demo on 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 snippet:
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));
});
Please do not restrain passwords!
You can also use
^[a-zA-Z]([a-zA-Z0-9]|(_(?!_)))+[a-zA-Z0-9]$
Demo
The only change comparing to your regex is changing [a-zA-Z0-9_] to [a-zA-Z0-9]|(_(?!_)). I removed underscore from the character set and allow it in the second part of the alternative if it's not followed by another one.
(?!_) is negative lookahead meaning that _ cannot be next character
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With