我想创建一个只匹配字母和数字的正则表达式,但开头和结尾都没有数字:
ahmed0saber
有效0ahmedsaber
无效ahmedsaber0
isnot validahmed_saber
无效
我试过了
[a-z0-9_]
但是它没有像预期的那样工作!
这应该可以工作^[a-z][a-zd]*[a-z]$
const regex = /^[a-z][a-zd]*[a-z]$/
const tests = ['ahmed0saber', '0ahmedsaber', 'ahmedsaber0', 'ahmed_saber']
tests.forEach(test)
function test(name) {
console.log(name, name.match(regex) ? 'yes' : 'no')
}
如果您还想允许使用单个字符:
^[a-z](?![a-zd]*d$)[a-zd]*$
^
起始字符串[a-z]
匹配单个字符a-z(?![a-zd]*d$)
负向前看,断言字符串不以数字结束[a-zd]*
匹配可选字符a-z或数字$
字符串结束
查看正则表达式演示。
或者如果支持向后看断言:
^[a-z][a-zd]*$(?<!d)
^
起始字符串[a-z]
匹配单个字符a-z[a-zd]*
匹配可选字符a-z或数字$
字符串结束(?<!d)
负向后看,断言末尾不是数字
查看另一个正则表达式演示。