在字符串中搜索模式

时间:2012-07-11 05:25:28

标签: java string

我有一个输入字符串如下:

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字的下一个实例并重复该任务。

3 个答案:

答案 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);
}