首页 > 解决方案 > 如何优化正则表达式模式?

问题描述

我正在尝试从文本中获取子字符串并使用正则表达式。示例文本:

bla bla 1:30-2pm bla bla 5-6:30am一些文字1-2:15am

我正在寻找时间框架条目(1-30-2pm ...)。将它们加粗仅是为了便于阅读

这是我的正则表达式:

\d{1,2}(:\d{1,2})? – \d{1,2}(:\d{1,2})?(am|pm)

爪哇片段:

public static List<String> foo(String text, String regex) {
    List<String> entries = new ArrayList<>();
    Matcher matcher = Pattern.compile(regex).matcher(text);
    while (matcher.find()) {
        entries.add(matcher.group());
    }
    return entries;
}

你能帮我优化正则表达式模式吗?可能有一些我错过的用例。

标签: javaregextextregex-lookaroundsregex-group

解决方案


我建议使用正则表达式

String regex = "(?i)(?<!\\d)(?:0?[1-9]|1[0-2])(?::[0-5]\\d)?\\p{Pd}(?:0?[1-9]|1[0-2])(?::[0-5]\\d)?[ap]m\\b";

查看正则表达式演示

细节

  • (?i)- 不区分大小写的标志(for AM, PM, am, pmvalues 等)
  • (?<!\d)- 不允许紧靠左边的数字
  • (?:0?[1-9]|1[0-2])- 一个可选的0,然后是一个数字,从1to 9,或1然后012
  • (?::[0-5]\d)?- 一个可选组:一个数字从05然后任何一个数字
  • \p{Pd}- 任何连字符
  • (?:0?[1-9]|1[0-2])(?::[0-5]\d)?- 看上面
  • [ap]m\b- aor pand thenm和一个单词边界。

推荐阅读