Java Can';我不能让正则表达式工作

Java Can';我不能让正则表达式工作,java,regex,jsoup,Java,Regex,Jsoup,我正在试图找出如何编写一个与时间匹配的regex。时间可以是这样的:11:15-12:15或11-12:15或11-12等等。我目前拥有的是: \\d{2}:?\\d{0,2}-{1}\\d{2}:?\\d{0,2} 直到有约会的时候它才开始工作。如果出现这样的字符串,则该regex将捕获2013-11-05。我不想让它找到日期。我知道我应该使用lookback,但我无法让它工作 我正在使用JsoupElementgetElementsMatchingOwnText方法,如果对该信息感兴趣的话

我正在试图找出如何编写一个与时间匹配的
regex
。时间可以是这样的:
11:15-12:15
11-12:15
11-12
等等。我目前拥有的是:

\\d{2}:?\\d{0,2}-{1}\\d{2}:?\\d{0,2}
直到有约会的时候它才开始工作。如果出现这样的字符串,则该
regex
将捕获
2013-11-05
。我不想让它找到日期。我知道我应该使用
lookback
,但我无法让它工作

我正在使用
Jsoup
Element
getElementsMatchingOwnText
方法,如果对该信息感兴趣的话

时间字符串包含在html源中。像这样:(但上面和下面有更多的文字)

2013-11-04
简单方法:

((\d{2}(:\d{2})-?){2}

更安全的环境;更详细的正则表达式:

([0-1]?[0-9]|[2][0-3])(:([0-5][0-9]))?-([0-1]?[0-9]|[2][0-3])(:([0-5][0-9]))?
行动中的例子:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class App {
    private static final String TIME_FORMAT = "%02d:%02d";
    private static final String TIME_RANGE = "([0-1]?[0-9]|[2][0-3])(:([0-5][0-9]))?-([0-1]?[0-9]|[2][0-3])(:([0-5][0-9]))?";

    public static void main(String[] args) {
        String passage = "The time can look like this: 11:15-12:15 or 11-12:15 or 11-12 and so on.";
        Pattern pattern = Pattern.compile(TIME_RANGE);
        Matcher matcher = pattern.matcher(passage);
        int count = 0;

        while (matcher.find()) {
            String time1 = formattedTime(matcher.group(1), matcher.group(3));
            String time2 = formattedTime(matcher.group(4), matcher.group(6));
            System.out.printf("Time #%d: %s - %s\n", count, time1, time2);
            count++;
        }
    }

    private static String formattedTime(String strHour, String strMinute) {
        int intHour = parseInt(strHour);
        int intMinute = parseInt(strMinute);

        return String.format(TIME_FORMAT, intHour, intMinute);
    }

    private static int parseInt(String str) {
        return str != null ? Integer.parseInt(str) : 0;
    }
}
输出:

Time #0: 11:15 - 12:15
Time #1: 11:00 - 12:15
Time #2: 11:00 - 12:00

试试这个。从基本正则表达式开始:

\d{1,2}(:\d\d)?-\d{1,2}(:\d\d)?
即:

  • 一到两个数字,可选后跟:和两个以上的数字
  • 后跟连字符
  • 后跟一到两个数字,可选后跟:和两个以上数字
这与您的所有核心案例相匹配:

11-12
1-2
1:15-2
10-3:45
2:15-11:30
等等。现在混合使用负向后看和负向前看,以使出现在不需要的上下文中的匹配无效。当数字、破折号或冒号直接出现在匹配的左侧或右侧时,让我们使匹配无效:

反向查找:
(?
消极前瞻:
(?!\d |-|:)

在开始时使用neg lookback,在结束时使用neg lookahead,可以得到:

(?<!\d|-|:)(\d{1,2}(:\d\d)?-\d{1,2}(:\d\d)?)(?!\d|-|:)
而不是

\d{1,2}
\d\d
小零件使用

(0[0-9]|[1-5][0-9])
而不是

\d{1,2}
\d\d
将限制性更强的字符类混合到正则表达式中,几乎不可能找到和维护beast:

(?<!\d|-|:)(((1[0-2]|0?[1-9]))(:((0[0-9]|[1-5][0-9])))?-(1[0-2]|0?[1-9])(:((0[0-9]|[1-5][0-9])))?)(?!\d|-|:)
(?
作为Java代码:

Pattern p = Pattern.compile("(?<!\\d|-|:)(((1[0-2]|0?[1-9]))(:((0[0-9]|[1-5][0-9])))?-(1[0-2]|0?[1-9])(:((0[0-9]|[1-5][0-9])))?)(?!\\d|-|:)");

Pattern p=Pattern.compile((?时间总是以空格分隔的“单词”出现吗?如果是这样,您可以使用
(\s| ^)…(\s|$)
强制表达式前后的字符为空格或行的开头/结尾。(演示:)简单方法:@mellanmokb,如果它是分隔的“单词”就可以工作“但事实并非如此,时间包含在html源代码中。例如:2013-11-04@JohanLindkvist我相信我已经想出了一个很好的方法。它很冗长,但肯定说明了一切,并给出了很好的解释。这也符合“1234”我还没有测试过,但它比我的稍长一些,也不太直观。例如,这与18-12:15匹配。24小时?眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨眨。我发布了一个我认为在任何情况下都有效的时间范围,但它非常详细。@Steve是的,但这不是一个有效的时间范围。看看他的示例时间范围。它们都没有尾随破折号。范围不以
-
结尾:)@史蒂文。哦,你完全正确!如果我加上:负面环视?编辑。+1是的,我认为这看起来是正确的,但你只需要“javify”它,并用合法的可能性替换非尾随的
\d
。对于非军事时间,它是:
”(?
Pattern p = Pattern.compile("(?<!\\d|-|:)(((1[0-2]|0?[1-9]))(:((0[0-9]|[1-5][0-9])))?-(1[0-2]|0?[1-9])(:((0[0-9]|[1-5][0-9])))?)(?!\\d|-|:)");