使用Java正则表达式从长字符串验证日期

时间:2012-06-18 18:07:30

标签: java regex date

我正在尝试编写一个可以解析长字符串日期的Java例程,即给定字符串:

"Please have the report to me by 6/15, because the shipment comes in on 6/18" 

正则表达式会找到6/15和6/18。我查看了Stack Overflow和其他地方,并且大多数日期正则表达式的例子只是验证给定字符串是否是日期,而不是在更大量的文本中查找日期。理想情况下,我想要一个正则表达式,可以识别人们数字编写日期的所有主要方式,即6/156/15/1206/15/1215/6/1215/06/12虽然为了cla的目的,也许最好将它们分成不同的正则表达式。我是regexes的新手(两天前我刚刚开始学习它们)和正则表达式对我来说仍然有点神秘,所以我很欣赏任何正则表达式建议的详细解释。

3 个答案:

答案 0 :(得分:2)

如果您没有打扰范围检查,这就足够了:

(\d{1,2})/(\d{1,2})(?:/(\d{4}|\d{2}))?

要检查您是否无法执行2/29/2001但可以执行2/29/2000,您确实希望在regexp完成其工作后执行此操作,或者您最终会进入庇护所

编辑:更好的是,为了隔离世纪,并防止像2/193这样的事情(由Alex的问题提示,即使这是一个单独的问题):

\b(\d{1,2})/(\d{1,2})(?:/(\d{2})?(\d{2}))?\b

每场比赛你都会获得4次抓捕:[month, day, century, year],其中centuryyear可能为空。

答案 1 :(得分:0)

\d{1,2}/\d{1,2}(?:/(?:\d{2}){1,2})?

以下是细分:

  • \d{1,2}匹配1或1位数字
  • /后跟/
  • \d{1,2}后跟1或2个数字
  • (?:/(?:\d{2}){1,2})?后跟可选的斜杠和2或4位数年份

从匹配项中,您可能希望使用Java DateParse解析它们,而不是尝试将所有验证规则放在正则表达式中。

你可能也希望防止分数1/4th 这可以通过在正则表达式中附加否定前瞻来完成:(?!th|rd|nd)如果后跟thrdnd,则会导致正则表达式不匹配。

答案 2 :(得分:0)

你的问题究竟是什么?你应该先阅读一些关于正则表达式的指南。

你需要一个方法来返回String中的每个匹配,如下所示: p是正则表达式,文本是你的文本。

private LinkedList<String> matches(String p, String text) {
    LinkedList<String> results = new LinkedList<String>();

    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

您可以使用|

分隔每个日期模式

如果将正则表达式的一部分放入大括号(...)中,则将此部分视为“组”。 因此,您可以从匹配的字符串中提取单个数字(如果您愿意)。