【问题标题】:Java regular expression for UserName with length range具有长度范围的用户名的 Java 正则表达式
【发布时间】:2016-08-10 09:28:26
【问题描述】:

我正在编写一个正则表达式来验证用户名。

规则如下:

  • 长度:6 - 20 个字符
  • 必须以字母 a-zA-Z 开头
  • 可以包含 a-zA-Z0-9 和点 (.)
  • 不能有 2 个连续的点

这是我尝试过的:

public class TestUserName {

    private static String USERNAME_PATTERN = "[a-z](\\.?[a-z\\d]+)+";
    private static Pattern pattern = Pattern.compile(USERNAME_PATTERN, CASE_INSENSITIVE);

    public static void main(String[] args) {
        System.out.println(pattern.matcher("user.name").matches()); // true
        System.out.println(pattern.matcher("user.name2").matches()); // true
        System.out.println(pattern.matcher("user2.name").matches()); // true

        System.out.println(pattern.matcher("user..name").matches()); // false
        System.out.println(pattern.matcher("1user.name").matches()); // false
    }
}

我使用的模式很好,但没有长度限制。

我尝试将 {6,20} 约束附加到模式,但失败了。

"[a-z](\\.?[a-z\\d]+)+{6,20}" // failed pattern to validate length

有人有什么想法吗?

谢谢!

【问题讨论】:

  • 你不能在任何地方附加{6,20}
  • 范围定义不应跟随,而是使用而不是加号('+'):[a-z](\\.?[a-z\\d]+){6,20}
  • {6,20} 后面的 + 是验证器犹豫不决的地方。但删除它不会修复它!它将允许重复 (..+) 部分,这可以根据您的需要进行。

标签: java regex validation


【解决方案1】:

您可以对所有检查使用前瞻正则表达式:

^[a-zA-Z](?!.*\.\.)[a-zA-Z.\d]{5,19}$
  • 使用[a-zA-Z.\d]{5,19},因为我们在开始时已经匹配了一个字符[a-zA-Z],这使得总长度在{6,20}范围内
  • 如果有 2 个连续点,负前瞻 (?!.*\.\.) 将断言失败

等效的 Java 模式将是:

Pattern p = Pattern.compile("^[a-zA-Z](?!.*\\.\\.)[a-zA-Z.\\d]{5,19}$");

【讨论】:

    【解决方案2】:

    使用否定的前瞻来防止双点:

    "^(?!.*\\.\\.)(?i)[a-z][a-z\\d.]{5,19}$"
    
    • (?i) 表示不区分大小写(所以[a-z] 表示[a-zA-Z]
    • (?!.*\\.\\.) 表示其中没有两个连续的点

    其余的很明显。

    live demo

    【讨论】:

      【解决方案3】:

      我会使用以下正则表达式:

      ^(?=.{6,20}$)(?!.*\.\.)[a-zA-Z][a-zA-Z0-9.]+$
      

      (?=.{6,20}$) 正向前瞻确保文本将包含 6 到 20 个字符,而(?!.*\.\.) 否定前瞻确保文本在任何时候都不会包含 ..

      【讨论】:

        【解决方案4】:

        这也足够了(仅用于匹配)

        (?=^.{6,20}$)(?=^[A-Za-z])(?!.*\.\.)
        

        对于捕获,匹配的模式,你可以使用

        (?=^.{6,20}$)(?=^[A-Za-z])(?!.*\.\.)(^.*$)
        

        【讨论】:

        • 它不检查规则的第三部分:将匹配[a-zA-Z0-9.]以外的字符
        • @Aaron 它说Can contain a-zA-Z0-9 and dot(.) 而不是特别指出it should 只包含这些..我是这样认为的
        猜你喜欢
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多