日期格式的java正则表达式提取错误的信息

时间:2012-10-25 09:17:27

标签: java regex date

我正在使用正则表达式来确定输入日期的格式。这是我正在使用的模式之一

    ^((18[5-9]|19[0-9]|20[0-9])\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$

因此约束是在1850年到2099年之间。如果我将此字符串作为日期20011212传递,当我从中提取年,月和日时,这就是我得到的:年份:2001年,月份:200,日:12。任何想法为什么?

    pattern = Pattern.compile(PATTERN);
    matcher = pattern.matcher(dateString);
    if (matcher.matches()){
       matcher.reset();
       if (matcher.find()){
          Integer.parseInt(matcher.group(1));
          Integer.parseInt(matcher.group(2));
          Integer.parseInt(matcher.group(3));
       }
    }

代码已经简化,但即使在这个简化版本上,它也会返回错误的结果。感谢您提出任何建议/解决方案。

4 个答案:

答案 0 :(得分:4)

在正则表达式中,您放在(...)内的所有内容都是捕获组。这一年你有两个小组,它们都是捕获小组:

group(1) = ((18[5-9]|19[0-9]|20[0-9])\\d)
group(2) = (18[5-9]|19[0-9]|20[0-9])
group(3) = (0?[1-9]|1[012])
group(4) = (0?[1-9]|[12][0-9]|3[01])

你也可以使用这样的非捕获块:(?:...)

所以你的模式应该是:

^((?:18[5-9]|19[0-9]|20[0-9])\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$

答案 1 :(得分:4)

第二组是当年的前三位数字,使用非捕获组:

^((?:18[5-9]|19[0-9]|20[0-9])\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$

答案 2 :(得分:2)

将正则表达式更改为^(18[5-9]\\d|19[0-9]\\d|20[0-9]\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$。在创建第二个匹配组的年份的前3位数字周围有一对括号。

答案 3 :(得分:1)

这是因为你在年度正则表达式中有一个捕获组(一对括号)。你可以:

  • 计算左括号并选择正确的括号。如果你将来要改变正则表达式,很难维护。
  • 使用命名组。并非所有正则表达式都支持这一点。我认为Java就是其中之一。
  • 使用非捕获组。

非捕获组在组的开头用?:表示:

^((?:18[5-9]|19[0-9]|20[0-9])\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$
   ^^--- here

请注意,环视((?= ... ),...)也是非捕获的。