我是Java中的正则表达式工具的新手,尽管我们有很大的潜力,但我很难完成这项任务。我想写一个正则表达式来验证一个输入字符串,它遵循以下语法:
我提出了以下解决方案:
([/./-_] {0,1}并[a-Z0-9]){5,}
但在某些情况下它仍然无法正常工作,例如它与允许其中一个特殊字符位于中间的字符串(例如he-llo)不匹配。我哪里做错了?为了我的目的,还有其他模式比这更好吗?
答案 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,})$