Java Regex在String中的两个单词之间找时间

时间:2014-01-21 06:31:27

标签: java regex regex-lookarounds

我试图找到String中两个特定单词之间的时间字段。以下是我输入的几个例子

实施例

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

使用RegEx

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

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

2 个答案:

答案 0 :(得分:2)

怎么样

[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

答案 1 :(得分:1)

您可以使用以下内容:

    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());
    }

<强>解释

enter image description here