Java正则表达式-字母数字,最多一个连字符、句点或下划线,七个字符长

Java正则表达式-字母数字,最多一个连字符、句点或下划线,七个字符长,java,regex,Java,Regex,我不熟悉Java中的正则表达式工具,尽管它们潜力巨大,但我很难完成这项任务。我想编写一个正则表达式来验证输入字符串,该字符串遵循以下语法: 小写字母和数字的任意组合 只有一个下划线、一个破折号或一个句点(没有其他特殊字符) 最小长度为5 我提出了以下解决方案: ([/./-{0,1}[a-z0-9]){5,} 但是,在某些情况下,它仍然不起作用,例如,它不匹配一个字符串,其中允许的一个特殊字符在中间(例如HLLO)。我哪里出错了?就我而言,还有比这更好的款式吗?这个怎么样?您可以使用“向前看”来

我不熟悉Java中的正则表达式工具,尽管它们潜力巨大,但我很难完成这项任务。我想编写一个正则表达式来验证输入字符串,该字符串遵循以下语法:

  • 小写字母和数字的任意组合
  • 只有一个下划线、一个破折号或一个句点(没有其他特殊字符)
  • 最小长度为5
  • 我提出了以下解决方案:

    ([/./-{0,1}[a-z0-9]){5,}


    但是,在某些情况下,它仍然不起作用,例如,它不匹配一个字符串,其中允许的一个特殊字符在中间(例如HLLO)。我哪里出错了?就我而言,还有比这更好的款式吗?

    这个怎么样?您可以使用“向前看”来验证至少有5个字符

    ^(?=.{5})[a-z0-9]*([-_.][a-z0-9]*)?$
    

    不要用正则表达式。由于事物可以以任何顺序出现,因此在没有以下情况下更容易:

    if (str.length() < 5) {
      return false;
    }
    int specialCharacterCount = 0;
    for (int i = 0; i < str.length(); ++i) {
      char c = str.charAt(i);
      if (Character.isLowerCase(c)) {
        // A lowercase letter.
      } else if (Character.isDigit(c)) {
        // A number.
      } else if ("_.-".indexOf(c) >= 0) {
        // An allowed special character.
        ++specialCharacterCount;
      } else {
        // Some other character - immediately invalid.
        return false;
      }
    }
    // Return true if there is at most one of _, . and -.
    return specialCharacterCount <= 1;
    
    if(str.length()<5){
    返回false;
    }
    int specialCharacterCount=0;
    对于(int i=0;i=0),则为else{
    //允许的特殊字符。
    ++特殊字符计数;
    }否则{
    //其他字符-立即无效。
    返回false;
    }
    }
    //如果最多有一个,则返回true。及-。
    
    return specialCharacterCount您可以在一个正则表达式中完成所有操作:

    ^                        # start string
    (?=[^-_.]*[-_.][^-_.]*$) # lookahead fulfilling condition 2
    ([-_.\w]{5,})            # all allowed characters at least 5
    $                        # end of string
    
    请参阅并注意,在
    Java
    中需要双反斜杠,以便表达式变成:

    ^(?=[^-_.]*[-_.][^-_.]*$)([-_.\\w]{5,})$
    

    通常,它有助于显示您测试的代码,以防出现编码错误。另外,有些东西不能使用正则表达式,必须进行解析。大多数人更喜欢解析器,因为结果是更干净的。你将需要查找表。下划线,破折号或句号可以放在哪里(在开始,中间,在结尾)?它几乎是正确的。您需要用可选组包装
    [-.][a-z0-9]*
    。另外,
    (?=.{5,})
    可以替换为
    (?=.{5})
    ,这就足够了。没有看到可选要求。谢谢。正是我想要的,正则表达式所需的代码行要少得多。@Jan我将采用这样的代码,我可以在一周中的任何一天轻松调试。老笑话是,解决正则表达式问题的人会遇到两个问题。可维护的代码比“代码行”更重要;regex两者都没有。