使用正则表达式的模式匹配用户名

时间:2018-08-26 12:07:12

标签: regex

我正在尝试使模式匹配具有以下规则的字符串:

  • 不超过15个字符
  • 两个字符串之间必须有句号
  • 数字只能在字符串的末尾
  • 只允许输入2位数字

示例失败

  • .asdfa
  • 爸爸。
  • 1apple.pear
  • apple.pear123

成功示例

  • apple.pear
  • ben.peach12

编辑时出现混乱:
这是用于HTML输入模式的

我尝试了以下
((([A-Za-z]+[.][A-Za-z]+){1,15})([0-9]{0,2}))
但是它不止于15个字符

还有这个
([A-Za-z.]{1,15})([0-9]{0,2})
但是如果没有,它就会匹配。

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})

取自regular-expressions.info

  

不同之处在于,环顾四周实际上与字符匹配,但是   然后放弃匹配,仅返回结果:匹配或不匹配。   这就是为什么它们被称为“断言”的原因。他们不消费   字符串中的字符,但仅断言是否可以匹配   是否。

此正则表达式的第一部分检查字符串的长度,但是-如上所述,根本不消耗任何字符。这样一来,您就可以对问题中提到的用户名进行检查了。