使用一个连字符的Java正则表达式最大长度

时间:2016-04-25 11:59:25

标签: java regex

我需要根据给定条件验证输入,

- 总长度必须为20个字符 - 前五个位置必须是字母 -remaining应该是数字,但必须存在一个连字符( - ),它应该仅在数字之间出现。 我有正则表达式

([a-zA-Z]){5}[0-9]+([-]){15} 

但它也允许结尾的连字符,甚至不连字符。

2 个答案:

答案 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;