gpt4 book ai didi

java - 无法让正则表达式工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:19 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何编写一个匹配时间的 regex。时间可以如下所示:11:15-12:1511-12:1511-12 等等。我目前拥有的是:

\\d{2}:?\\d{0,2}-{1}\\d{2}:?\\d{0,2}

在日期到来之前它确实有效。如果像这样的字符串来自 2013-11-05,此 regex 将捕获。我不希望它找到日期。我知道我应该使用 Lookbehind 但我无法让它工作。

我正在使用 Jsoup Element getElementsMatchingOwnText 方法,如果该信息有任何兴趣的话。

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

<td class="text">2013-11-04</td>

最佳答案

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

\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|-|:)负面前瞻:(?!\d|-|:)

在开头拍打 neg-lookbehind,在结尾拍打 neg-lookahead,你会得到:

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

或作为 Java 字符串(按要求)

Pattern p = Pattern.compile("(?<!\\d|-|:)(\\d{1,2}(:\\d\\d)?-\\d{1,2}(:\\d\\d)?)(?!\\d|-|:)");

现在虽然环视已经消除了日期内的匹配,但您仍然匹配一些愚蠢的东西,例如 99:99-88:88,因为\d 匹配任何数字 0-9。您可以将更多限制性字符类混合到此正则表达式中以解决该问题。例如,使用 12 小时制:

对于小时部分,使用

(1[0-2]|0?[1-9])

代替

\d{1,2}

对于分钟部分使用

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

代替

\d\d

将限制性更强的字符类混合到正则表达式中会产生几乎不可能理解和维护的野兽:

(?<!\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|-|:)");

关于java - 无法让正则表达式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com