用户名正则表达式在检查长度时不起作用

时间:2018-07-27 19:23:10

标签: java regex

我正在尝试根据以下规则使用Java验证用户名:

  • 必须以小写字母(a-z)开头
  • 后续字符可以是小写字母(a-z)或数字(0-9)
  • 只有一个符号,句号“。”只能使用一次,并且不能位于用户名的开头或结尾

我用来执行验证的正则表达式为^[a-z]+\.?[a-z0-9]+$

这很好用(可能有更好的方法),但是现在我要允许用户名长度在3到10个字符之间。我尝试使用{3,10}的任何地方,例如^([a-z]+\.?[a-z0-9]+){3,10}$,验证失败。我使用的是出色的visual regex toolonline regex tester

代码本身非常简单;我正在Java 8中使用String类的matches方法。 john.doe 通过了正则表达式和长度验证,但 j.doe 没有。 >

根据所选答案进行更新:

考虑到正则表达式的复杂性,Java代码可能有点不言自明:

private static final String PATTERN_USERNAME_REGEX = new StringBuilder()
    // the string should contain 3 to 10 chars
    .append("(?=.{3,10}$)")
    // the string should start with a lowercase ASCII letter
    .append("[a-z]")
    // then followed by zero or more lowercase ASCII letters or/and digits
    .append("[a-z0-9]*")
    // an optional sequence of a period (".") followed with 1 or more lowercase ASCII letters
    // or/and digits (that + means you can't have . at the end of the string and ? guarantees
    // the period can only appear once in the string)
    .append("(?:\\\\.[a-z0-9]+)?")
    .toString();

1 个答案:

答案 0 :(得分:4)

您要寻找的正则表达式是

^(?=.{3,10}$)[a-z][a-z0-9]*(?:\.[a-z0-9]+)?$

在Java中,

s.matches("(?=.{3,10}$)[a-z][a-z0-9]*(?:\\.[a-z0-9]+)?")

请参见regex demo

详细信息

  • ^-字符串的开头(无需在String#matches中使用)
  • (?=.{3,10}$)-字符串应包含3到10个字符
  • [a-z]-小写的ASCII字母
  • [a-z0-9]*零个或多个小写ASCII字母或数字
  • (?:\.[a-z0-9]+)?-.的可选序列,后跟1个或多个小写ASCII字母或数字,(+表示您不能在.字符串的末尾,?保证.在字符串中只能出现一次)
  • $-字符串结尾(无需在String#matches中使用)