我试图找到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)
我似乎没有得到它。不确定两者之间的特殊字符是否导致问题。但是,如果我使用任何字符,而不是字母数字,那么我的两个关键字之间的所有单词都会被捕获。 谁能让我知道我在这里做错了什么?
答案 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
但是,正如其他人所指出的那样,如果字符串总是相同的话那么最好使用子字符串等。使用正则表达式它会变得比它需要的复杂得多。
修改:在dog
和done
之间找到
Dog.*([0-9]?[0-9]:[0-9]?[0-9] AM|PM).*done
并使用\1
获取匹配时间或在Dog
和done
之间创建子字符串并使用第一个正则表达式。
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());
}
<强>解释强>