我想在以下条件下为用户名实现正则表达式:
用户名仅包含a-z,A-Z,0-9和 - (连字符);
用户名不应仅包含数字或仅限连字符,但只能包含字符;
第一个&最后一个字符不应该是连字符(可以是数字但不是完全数字);
此外,不应该有两个连字符背靠背;
最小字符数为5,最大值为25;
到目前为止,我已尝试过这个正则表达式:
var filter = /(?=[a-zA-Z0-9-]{5,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$/;
它正确地达到了条件1,3,4和5。但它并不完全满足条件2.在我的正则表达式中,它确保它不完全由连字符组成。但它确实只允许数字,不应该这样。
任何人都可以让我知道我哪里出错或需要做什么。正如对正则表达式的解释一样。
答案 0 :(得分:5)
为了可维护性,这样的事情通常更好地写成一系列测试而不是一次大测试。
var filter = function (username) {
var allDigits = /^[0-9]+$/g,
allHyphens = /^[-]+$/g, //doesn't need a character class, but I find it's more readable
multiHyphens = /[-]+/g,
startsWith = /^[A-Za-z0-9]{1}/,
endsWith = /[A-Za-z0-9]{1}$/
hasInvalidChars = /[^A-Za-z0-9-]/,
meetsReqs = false;
if (username.length >= 5 || username.length <= 25) { //ensure correct length
meetsReqs = !allDigits.test(username);
meetsReqs = meetsReqs && !allHyphens.test(username);
meetsReqs = meetsReqs && !multiHyphens.test(username);
meetsReqs = meetsReqs && !hasInvalidChars.test(username);
meetsReqs = meetsReqs && startsWith.test(username);
meetsReqs = meetsReqs && endsWith.test(username);
}
return meetsReqs;
};
答案 1 :(得分:3)
您可以在开头添加否定前瞻。我还将^
锚放在表达式的开头。
^(?![0-9]+$)(?=[a-zA-Z0-9-]{5,25}$)[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
^^^^^^^^^^^
这可以防止^[0-9]+$
的匹配,换句话说,就是一个只包含数字的字符串。
答案 2 :(得分:0)
这似乎可以在我的电脑上进行快速测试:
^(?![^-]*--+)(?![0-9]+$)[a-zA-Z0-9][-a-zA-Z0-9]{3,23}[a-zA-Z0-9]$
解释
^(?![^-]*--+) No double (or more) hyphens
(?![0-9]+$) Digits only forbidden
[a-zA-Z0-9] Starts with a-z A-Z or 0-9
[-a-zA-Z0-9]{3,23} Three to 23 more characters, including hyphens
[a-zA-Z0-9]$ Ends with a-z A-Z or 0-9
这是1 +(3到23)+ 1个字符,即5到25个。