我需要根据给定条件验证输入,
- 总长度必须为20个字符 - 前五个位置必须是字母 -remaining应该是数字,但必须存在一个连字符( - ),它应该仅在数字之间出现。 我有正则表达式
([a-zA-Z]){5}[0-9]+([-]){15}
但它也允许结尾的连字符,甚至不连字符。
答案 0 :(得分:2)
您可以使用
^[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+$
请参阅regex demo。
详细:
^
- 匹配字符串的开头[a-zA-Z]{5}
- 匹配5个字母(?=[0-9-]{15}$)
- 要求字符串的其余部分应为15个字符[0-9]+-[0-9]+
- 1+位数后跟连字符,后跟1位数字$
- 字符串结尾(您可以替换为\z
以排除字符串末尾最后一个换行符之前的匹配)如果您使用.matches()
,则可以省略外部锚点。
请参阅Java test:
String pat = "[a-zA-Z]{5}(?=[0-9-]{15}$)[0-9]+-[0-9]+";
System.out.println("abcde123456-89012345".matches(pat)); // true
System.out.println("abcde-12345689012345".matches(pat)); // false
System.out.println("abcde12345689012345-".matches(pat)); // false
System.out.println("abcde12345689012345-12".matches(pat)); // false
答案 1 :(得分:0)
只需在此添加非正则表达式视角:
if (str.length() != 20) {
return false;
}
for (int i = 0; i < 5; ++i) {
if (!Character.isAlphabetic(str.charAt(i)) {
return false;
}
}
boolean hyphenFound = false;
for (int i = 5; i < 20; ++i) {
char ch = str.charAt(i);
if (ch == '-') {
hyphenFound = true;
} else if (!Character.isDigit(ch) && !Character.isAlphabetic(ch)) {
return false;
}
}
return hyphenFound;