【问题标题】:Java Regex to find time between two words in a StringJava正则表达式查找字符串中两个单词之间的时间
【发布时间】:2014-01-21 06:31:27
【问题描述】:

我正在尝试查找字符串中两个特定单词之间的时间字段。以下是我输入的几个示例

例子

The Big Cat eats at 3:49 AM and the Big Dog eats  Daily (BBB) , On 12 at 5:00 AM done
The Big Cat eats at 3:49 AM and the Big Dog eats  Daily (BBB) , On 12 at 11:00 PM done

预期输出

5:00 AM
11:00 PM

使用正则表达式

(?<=Dog\s(\w+))((\d):(\d)(\d)\sAM)(?=\sdone)

我似乎没有正确理解它。不确定中间的特殊字符是否会导致问题。但是,如果我使用任何字符而不是字母数字,那么我的两个关键字之间的所有单词都会被捕获。 谁能告诉我我在这里做错了什么?

【问题讨论】:

  • 您可以使用 split() 两次来执行此操作(代码会很简单).. 使用 Regex 的任何具体原因??..
  • 如果regex 不是必需的,这个怎么样? System.out.println(str.substring(str.indexOf(" at ")+4,str.indexOf(" and "))); :)
  • @RafaEl - 我的意思是……有几种方法可以做这件事……而正则表达式使事情变得复杂……
  • @TheLostMind 是的,同意你的观点,regex 似乎不适合这种情况。
  • @TheLostMind 在这方面不能同意你的更多观点,但我正在尝试构建一个进行文本解析的工具,我想通过使用正则表达式提取数据而不是在其中进行操作来保持设计的通用性我的java代码

标签: java regex regex-lookarounds


【解决方案1】:

怎么样

[0-9]?[0-9]:[0-9]?[0-9] AM|PM

假设您的时间始终采用(x)x:(x)x AM(x)x:(x)x PM 的形式

澄清:

[0-9]  matches any digit from 0-9
?      matches 0 or 1 occurences
x|y    matches x or y

但是,正如其他人所指出的,如果字符串始终相同,那么最好使用子字符串等。使用正则表达式会变得比需要的复杂得多。


编辑:在dogdone 之间找到它

 Dog.*([0-9]?[0-9]:[0-9]?[0-9] AM|PM).*done

并使用\1 获取匹配时间或在Dogdone 之间创建一个子字符串并使用第一个正则表达式。


Edit2:我添加了一个有效的example

public static void main (String[] args) {
    String in = "The Big Cat eats at 3:49 AM and the Big Dog eats  Daily (BBB) , On 12 at 5:00 AM done";
    Pattern pattern = Pattern.compile("Dog.*([0-9]?[0-9]:[0-9]?[0-9] AM|PM).*done");
    Matcher matcher = pattern.matcher(in);

    System.out.println("matching");
    while(matcher.find()) {
        System.out.println(matcher.group(1) + "");
    }
}

输出:

matching
5:00 AM

【讨论】:

  • 这也给了我其他时间,而我只需要两个关键字“Dog”和“done”之间的时间。我尝试在我的表达式中替换上面的正则表达式,但它仍然没有给我结果。
  • 好的。如果它总是在相同的关键字之间,找到那些并在这些索引之间使用子字符串。
  • 完美运行。非常感谢:)
【解决方案2】:

你可以使用这样的东西:

    String val="Big Cat eats at 3:49 AM and the Big Dog eats  Daily (BBB) , On 12 at 11:00 AM done";
    String REGEX="(?:Dog[a-zA-Z0-9(),])*([0-9]?[0-9]:[0-9]?[0-9] (AM|PM))(?=\\sdone)";

    Pattern pattern = Pattern.compile(REGEX);
    Matcher matcher = pattern.matcher(val);
    while(matcher.find()){
        System.out.println(matcher.group());
    }

说明:

【讨论】:

  • 非常感谢。虽然@k-mera 已经提供了正则表达式。但是您的正则表达式给了我匹配组(0)的时间,因此将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多