正则表达式总是返回其他

时间:2013-09-23 14:26:13

标签: java regex

我正在尝试为军事时间写一个正则表达式(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());
        }           
    }

2 个答案:

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