提取字符串中嵌入的日期和模式的最佳方法

3

我希望从一个字符串中提取日期/时间格式。

例如,有三个字符串:

1: "current date: 01/05/2017."
2: "The start date was 15.11.2016."
3: "Christmas (24.12) was on saturday.

我需要的第一份信息是模式:
1: "MM/dd/yyyy"
2: "dd.MM.yyyy"
3: "dd.MM"

第二个信息是提取的日期部分:
1: "01/05/2017"
2: "15.11.2016"
3: "24.12"

...或者是该结果第一个值的位置。

所有可能的模式都已经预先知道。

我不知道如何以优雅且高效的方式实现这一点。


5
可能需要使用正则表达式。 - J Fabian Meier
1
使用正则表达式。 - avilac
1
我赞同使用正则表达式的方法。只需谷歌日期时间正则表达式即可。 - user489041
4
哪种逻辑可以帮助你确定01/02/2000是“2月1日”还是“1月2日”? - xenteros
1
值得一提的是,除非没有其他选择,否则应避免从字符串表示中解析数据。引用Josh Bloch的话:“在没有这样的方法[在异常中]的情况下,程序员已知会解析异常的字符串表示以获取其他信息。这是极其糟糕的做法[...]。类很少指定其字符串表示的详细信息,因此字符串表示可能因实现和版本而异。因此,解析异常的字符串表示的代码可能是不可移植和脆弱的。” - jpangamarca
显示剩余11条评论
1个回答

2
像这样怎么样:
String regex = "(\\d{2}/\\d{2}/\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("current date: 01/05/2017.");
if (matcher.find()) {
    start = matcher.start(); // start index of match
    end = matcher.end(); // end index of match
    result = matcher.group(1);
}

现在根据输入的必要模式编辑正则表达式。

请记住,这并不检查给定日期是否有效。

编辑:根据评论添加了两行。


谢谢,:) 这对于模式检查可能很有帮助。但问题是这个匹配的位置。 - Smoothi
我认为他的意思是匹配发生的索引位置。 - m0skit0
是的,“index” 是正确的词。 :) @Smurf:我误解了你的解决方案。索引不是必需的,但感谢您的编辑。 - Smoothi
@Smurf:我尝试了你使用while循环的解决方案,我认为匹配器可以解决我的问题。 - Smoothi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接