1

我正在尝试为军事时间(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());
        }           
    }
4

2 回答 2

7

我知道这已经得到回答和接受,但我建议使用更简单和明确的正则表达式,而不是使用lookbehinds:

([0-1][0-9]|2[0-3])[0-5][0-9]

它更短,每个正则表达式引擎都支持,并且(至少对我而言)更清晰。

于 2013-09-23T14:51:25.593 回答
2

你想要一个look-behind(?<=2)而不是look-ahead (?=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
于 2013-09-23T14:31:18.073 回答