0

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

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

4

3 回答 3

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");
于 2012-07-11T05:39:51.807 回答
0

使用正则表达式匹配日期。

正则表达式:.*?StartDate[ ]+(\d{2}\\\d{2}\\\d{4})[ ]+EndDate[ ]+(\d{2}\\\d{2}\\\d{4})).*

  • 在上面的正则表达式中,匹配的第一组是开始日期,匹配的第二组是结束日期。

请参阅以下链接以了解如何在 Java 中使用正则表达式:http: //docs.oracle.com/javase/tutorial/essential/regex/

于 2012-07-11T05:35:22.430 回答
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);
}
于 2012-07-11T05:36:00.013 回答