java - 在字符串中查找日期

标签 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”。我该怎么做?

最佳答案

您的示例输入包含月份中的个位数天数,这是您的正则表达式所不允许的;它将匹配“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])"
)

或者您可以添加一个负向后查找,以确保您不会匹配较大数字中间的月份,并将其简化为

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.
)

当然,如果您为非美国用户提供服务,假设月/日/年排序是有问题的。

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

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

关于java - 在字符串中查找日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831789/

相关文章:

java - java 类中的 ArrayList getter 和 setter

java - 如何在服务层的 PlayFramework 2 中进行异步调用?

java - 程序管理器的类名

java - 选择排序返回不在我的数组中的零

java - 使用 ImageIO 导出 8 位 dpeth JPEG

java - 如何使用 OpenCV 和 Android Studio 从手机加载图像?

java - Netty - 客户端读写操作

java - 在您的类路径中找不到编译器! (您可能需要添加 'tools.jar' )Axis 1.4 + Tomcat 9.0

java - Hibernate HQL批量删除不删除连接表值

java - 从非线程安全类实例化线程安全类