【问题标题】:Using Java regex to validate date from a long string使用 Java 正则表达式验证长字符串中的日期
【发布时间】:2012-06-20 18:11:51
【问题描述】:

我正在尝试编写一个 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 的目的进入不同的正则表达式。我是正则表达式的新手(我两天前才开始了解它们)并且正则表达式对我来说仍然有点神秘,所以我很感激任何正则表达式建议的详细解释。

【问题讨论】:

    标签: java regex date


    【解决方案1】:

    如果您不关心范围检查,这就足够了:

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

    要检查您不能执行2/29/2001 但可以执行2/29/2000,您真的想在正则表达式完成其工作后执行此操作,否则您将最终陷入庇护。

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

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

    您将在每场比赛中获得 4 次捕获:[month, day, century, year],其中centuryyear 可能为空。

    【讨论】:

    • 你的两个日期都是一样的。你的意思是20012000
    • 在“2012 年 6 月 18 日”是否会出现两次匹配 - 一次用于“6/18”,一次用于“18/20”?有什么办法可以防止吗?
    • @Alex:在我知道的任何引擎中,正则表达式都不是这样工作的。比赛不能重叠。 (您可以使用前瞻/后视来伪造重叠,但匹配本身仍然是不相干的。)
    • @Amadan 谢谢,很高兴知道这一点。
    【解决方案2】:
    \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,这会导致正则表达式不匹配。

    【讨论】:

      【解决方案3】:

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

      您需要一个方法来返回字符串中的每个匹配项,如下所示: p 是正则表达式,text 是您的文本。

      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;
      }
      

      您可以用 | 分隔每个日期模式

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-09
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 2016-07-30
        相关资源
        最近更新 更多