【问题标题】:Why my regex isn't working for date?为什么我的正则表达式不适用于日期?
【发布时间】:2015-04-13 17:58:21
【问题描述】:

我在使用正则表达式匹配字符串中的日期时遇到了问题。实际上我有很多“日期格式”要匹配,但第一个不起作用,我不明白为什么它不起作用......

格式类似于“2013 年 9 月 12 日”或“2014 年 5 月 6 日”或“2014 年 6 月 2 日”...

在我的字符串 text 中,有以下日期:“2014 年 7 月 4 日”。

这是我的代码:

Pattern p = Pattern.compile("[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(text);
System.out.println(m.group(1));

但是就出现了这个错误:

Exception in thread "main" java.lang.IllegalStateException: No match found

我什至尝试过使用较小的正则表达式,但它仍然不匹配任何内容。

提前感谢您的帮助!

【问题讨论】:

  • 你没有调用findmatches方法
  • 你需要使用查找功能。
  • 不要使用正则表达式来检查日期:有太多的边缘情况(例如闰年和 1752 年 9 月)。相反,尝试解析并处理任何异常。
  • 我怀疑您误解了group(x) 的含义。你能解释一下你对m.group(1) 的期望结果吗?
  • @anubhava @Avunash Raj 谢谢,它帮助我理解了问题^^ @Bathsheba 你能详细解释一下吗? ^^ @Pshemo 我现在明白了,它打印了我用() 圈起来的第一场比赛^^

标签: java regex date


【解决方案1】:

您需要在调用Matcher#group 之前调用Matcher#find()Matcher#matches()

否则,不会执行匹配,因此您既没有整个组,也没有填充任何单个反向引用。

上述两种方法都返回boolean,这将帮助您推断您想要的组是否包含任何文本。

一个典型的成语是:

if (matcher.find()) {
    // get the group(s)
}

文档here

另一方面,我建议您使用 DateFormats 而不是日期的正则表达式 - API here

【讨论】:

  • 感谢您的回答,我尝试与 Pattern.matches 匹配,但它返回 false。我什至尝试使用正则表达式“可能”(我在文本中发现了 3 次)但也是错误的。实际上,我想在字符串中找到第一个日期,并列出我所拥有的日期格式,并且我想为此使用正则表达式,DateFormat 可以帮助我在我的字符串中找到日期吗?
  • @Malik System.out.println(Pattern.matches("[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}", "September 12, 2013")); 返回true。检查您的输入文本。
  • 我想我明白为什么我弄错了,日期是包含在字符串中,它不是字符串本身,这就是它返回false的原因
  • 谢谢,所以我测试了if (m.find()) { System.out.println(m.group(1)); },它返回2,你知道什么意思吗?
  • @Malik 表示您捕获的组索引为1,即(1|2) 返回2,正如预期的那样。
【解决方案2】:

您需要为 m.find() 设置条件并打印 m.group(0) 来代替 (1)。

    String text = "July 4, 2014";
    String pattern = "\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\\D [0-9]{1,2}, [0-9]{4}";

    Pattern r = Pattern.compile(pattern);

    Matcher m = r.matcher(text);
    if(m.find()){
    System.out.println("Found value: " + m.group(0));
    }

【讨论】:

    【解决方案3】:

    您需要检查if(m.find()) 并打印m.group(0),因为如果您打印m.group(1),这将根据您的输入打印1 或2,(1|2),因为您的输入是2014,m.group(1) 将打印2。而m.group(0) 表示"[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}" 的第一组,它会打印您的全文,因为它将您的完整正则表达式作为第一组,因为除了(1|2) 之外没有其他组。

    试试这个代码。

    String text="July 4, 2014";
    Pattern p = Pattern.compile("[a-zA-Z]+ [0-3]?[0-9], (1|2)\\d{3}", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(text);
    if (m.find( )) {
        System.out.println(m.group(0));
    }else{
        System.out.println("No match found");
    }
    

    输出

    2014 年 7 月 4 日

    访问here以了解基本示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多