我正在尝试为军事时间写一个正则表达式(0000-2359),但它允许通过任何小时达到29.为什么表达式不会抛出24XX +的错误?
while(true)
{
try
{
sInput = input.nextLine();
// If the input is a properly formatted time break the loop
// otherwise throw invalidTimeFormatException
if(Pattern.matches("[0-2](?:(?=2)[0-3]|[0-9])[0-5][0-9]", sInput))
{
// This will only happen if the time is properly formatted
// thanks to the regular expression above.
break;
}
throw invalidTimeFormatException;
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
答案 0 :(得分:7)
我知道这已经得到了回答和接受,但我建议使用更简单明了的正则表达式而不是使用lookbehinds:
([0-1][0-9]|2[0-3])[0-5][0-9]
它更短,在每个正则表达式引擎中得到支持,并且(至少对我来说)更加清晰。
答案 1 :(得分:2)
您想要一个后视(?<=2)
而不是前瞻(?=2)
。
实际上,它匹配“第一个字符0,1或2;下一个字符,如果它是2然后0-3,否则0-9;等等。”
修改:实际上,您需要一个否定后视(?<!2)
,以确保前一个字符2
不匹配[0-9]
,并且不需要成为非捕获组:
[0-2]((?<=2)[0-3]|(?<!2)[0-9])[0-5][0-9]
\____/
|
add negative look-behind here