Java RegularExpression

时间:2015-11-18 15:46:51

标签: java regex

请帮我展示正确的输出。我怎么能得到这个,我的输出总是假的。

    System.out.print("Enter Time: ");
    str = scanner.nextLine();

    String regextime = "((([0-1]?[0-2])|(0?[0-9])):[0-6][0-9]:[0-6][0-9][ ]?[AaPp][Mm]) | ((([2]?[0-4])|([0-1]?[0-9])):[0-6][0-9]:[0-6][0-9])";
    //12 hr
    //(([0-1]?[0-2])|(0?[0-9])):[0-6][0-9]:[0-6][0-9][ ]?[AaPp][Mm]
    //24hr
    //(([2]?[0-4])|([0-1]?[0-9])):[0-6][0-9]:[0-6][0-9]
    System.out.println(str.matches(regextime));

1 个答案:

答案 0 :(得分:1)

正则表达式模式不允许随机空格。你有两个大的正则表达式模式,中间用|分隔。 |每边都有一个空格。正则表达式匹配器假定这些空间是模式的一部分,所以在ampm期间它需要一个尾随空格,并且在24小时内它需要一个前导空格。 / p>

将您的模式更改为:

String regextime = "((([0-1]?[0-2])|(0?[0-9])):[0-6][0-9]:[0-6][0-9][ ]?[AaPp][Mm])|((([2]?[0-4])|([0-1]?[0-9])):[0-6][0-9]:[0-6][0-9])";

或者,如果您希望保持空白以便清晰,可以在模式(?x)中添加一个标志,告诉它忽略空格。然后,您必须转义所有要保留的空格,因此必须在\\之前的字符类空格前添加AM/PM

String regextime = "(?x)((([0-1]?[0-2])|(0?[0-9])):[0-6][0-9]:[0-6][0-9][\\ ]?[AaPp][Mm]) | ((([2]?[0-4])|([0-1]?[0-9])):[0-6][0-9]:[0-6][0-9])";