我正在尝试使模式匹配具有以下规则的字符串:
示例失败
成功示例
编辑时出现混乱:
这是用于HTML输入模式的
我尝试了以下
((([A-Za-z]+[.][A-Za-z]+){1,15})([0-9]{0,2}))
但是它不止于15个字符
还有这个
([A-Za-z.]{1,15})([0-9]{0,2})
但是如果没有,它就会匹配。
答案 0 :(得分:1)
不要一次全部做完。
首先,将问题分解成几个小部分,无论如何对于保持它都是很好的。
第二,如果您决定要更改要求,则可以更轻松地完成操作。
第三,当用户提交用户名时,您可以准确地告诉他们您不喜欢的用户名。指定失败的单个验证规则比说它无效是一种更好的UX。
因此,尽管如此……HTML的pattern
属性可能不是验证此类复杂规则的最佳方法。相反,您应该使用JavaScript进行验证(并再次在服务器上),并根据需要显示自定义有效性文本。
input.onchange = function() {
if( this.value.length > 15) {
this.setCustomValidity("Max length: 15 characters");
return;
}
var parts = this.value.split(".");
if( parts.length != 2 || !parts[0] || !parts[1]) {
this.setCustomValidity("Must have two parts separated by a dot");
return;
}
if( this.value.replace(/\d+$/,'').match(/\d/)) {
this.setCustomValidity("Digits can only appear at the end");
return;
}
if( this.value.match(/\d{3}$/)) {
this.setCustomValidity("Max of two digits at the end");
return;
}
this.setCustomValidity(""); // valid
};
答案 1 :(得分:0)
您可以针对此问题使用正向查找。
(?=.{1,15}$)([a-z]+\.[a-z]+[0-9]{0,2})
不同之处在于,环顾四周实际上与字符匹配,但是 然后放弃匹配,仅返回结果:匹配或不匹配。 这就是为什么它们被称为“断言”的原因。他们不消费 字符串中的字符,但仅断言是否可以匹配 是否。
此正则表达式的第一部分检查字符串的长度,但是-如上所述,根本不消耗任何字符。这样一来,您就可以对问题中提到的用户名进行检查了。