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

时间:2017-03-29 20:37:22

标签: java regex

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

  1. 小写字母和数字的任意组合
  2. 只有一个下划线,一个短划线或一个句号(没有其他特殊字符)
  3. 最小长度为5
  4. 我提出了以下解决方案:

    ([/./-_] {0,1}并[a-Z0-9]){5,}

    但在某些情况下它仍然无法正常工作,例如它与允许其中一个特殊字符位于中间的字符串(例如he-llo)不匹配。我哪里做错了?为了我的目的,还有其他模式比这更好吗?

3 个答案:

答案 0 :(得分:3)

这个怎么样?您可以使用预先验证至少有5个字符。

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

答案 1 :(得分:2)

不要使用正则表达式。由于事物可以以任何顺序出现,因此没有:

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;

答案 2 :(得分:1)

你可以在一个正则表达式中完成所有操作:

^                        # start string
(?=[^-_.]*[-_.][^-_.]*$) # lookahead fulfilling condition 2
([-_.\w]{5,})            # all allowed characters at least 5
$                        # end of string

请参阅a demo on regex101.com并注意Java中需要双反斜杠,以便表达式变为:

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