我有一个输入字符串如下:
john is a StartDate 10\11\2012 EndDate 15\11\2012 john is a boy john is StartDate john
我想从上面的字符串中提取两个日期StartDate和EndDate。
但是,我不能只搜索单词StartDate,因为在字符串末尾看到,StartDate可能是一个独立的单词。我不能采取第一个实例,因为没有任何保证,StartDate单词的日期将永远是第一个。
因此解决方案是一起搜索模式StartDate%EndDate%。即StartDate和EndDate字样在一起。
实现这一目标的最佳方法是什么?
我能想到的一个解决方案是每个单词StartDate的实例,取下一个单词的子串(包括StartDate)并在该子串中搜索单词EndDate。如果它存在,我们有正确的子字符串,否则转到StartDate字的下一个实例并重复该任务。
答案 0 :(得分:1)
使用正则表达式(replaceFirst
)提取的快速而肮脏的方式:
String input = "john is a StartDate 10\\11\\2012 EndDate 15\\11\\2012 john is a boy john is StartDate john";
String startDate = input.replaceFirst(".*(StartDate \\d{1,2}\\\\\\d{1,2}\\\\\\d{4}).*", "$1");
String endDate = input.replaceFirst(".*(EndDate \\d{1,2}\\\\\\d{1,2}\\\\\\d{4}).*", "$1");
System.out.println(startDate);
System.out.println(endDate);
如果您只想要日期:
String startDate = input.replaceFirst(".*StartDate (\\d{1,2}\\\\\\d{1,2}\\\\\\d{4}).*", "$1");
String endDate = input.replaceFirst(".*EndDate (\\d{1,2}\\\\\\d{1,2}\\\\\\d{4}).*", "$1");
答案 1 :(得分:0)
使用正则表达式匹配日期。
正则表达式:.*?StartDate[ ]+(\d{2}\\\d{2}\\\d{4})[ ]+EndDate[ ]+(\d{2}\\\d{2}\\\d{4})).*
请参阅以下链接,了解如何在Java中使用正则表达式:http://docs.oracle.com/javase/tutorial/essential/regex/
答案 2 :(得分:0)
我会选择一个简单的正则表达式,因为你的模式定义得很好:
String input = "john is a StartDate 10\\11\\2012 EndDate 15\\11\\2012 john is a boy john is StartDate john";
Matcher matcher = Pattern.compile("StartDate (.*?) EndDate (.*?) ").matcher(input);
if (matcher.find()) {
startDate = matcher.group(1);
endDate = matcher.group(2);
}