在字符串中查找日期

时间:2014-11-09 18:35:40

标签: java

我正在使用我发现的一些代码来查找字符串中的日期,并略微修改以处理两年和四年的日期。

Matcher m = Pattern.compile("(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](2[0][0-9][0-9]|[0-9][0-9])").matcher(msgBody.substring(iStart));
while (m.find()) {
        allMatches[count] = m.group();
        count++;
}

它返回我正在搜索的字符串中的大部分两位和四位数年份日期,但是当字符串包含“* Valid 11/3 / 14-11 / 9/14”时,它不会返回结果。

我希望第一次找到“11/3/14”,第二次找到“11/9/14”。我该怎么做?

1 个答案:

答案 0 :(得分:0)

您的示例输入包含一个月中的单个数字日,您的正则表达式不允许这样做;它将匹配" 11/03/14"但不是" 11/3/14"。

如果您想匹配单位数字,我认为您的0[1-9]应为0?[1-9]

Pattern.compile(
    "(0?[1-9]|1[012])"
    + "[- /.]"
    + "(0?[1-9]|[12][0-9]|3[01])"
    + "[- /.]"
    + "(2[0][0-9][0-9]|[0-9][0-9])"
)

或者您可以添加一个负面的lookbehind以确保您不会在较大数字的中间匹配一个月并将其简化为

Pattern.compile(
    "(?<![0-9])"  // Don't start match in middle of a number.
    + "(0?[1-9]|1[012])"  // Month of year
    + "[- /.]"  // Separator
    + "(0?[1-9]|[12][0-9]|3[01])"  // Day of month
    + "[- /.]"  // Separator
    + "(20[0-9][0-9]|[0-9][0-9])"  // 2 or 4 digit year
    + "(?![0-9])"  // Don't match if year continues.
)

当然,如果您为非美国用户提供服务,假设MONTH / DAY / YEAR订购有问题。

如果您还没有,请参阅"Falsehoods programmers believe about time"

此外,您的代码将解析15岁或以上出生于1920年的任何人的生日。