我正在使用正则表达式来确定输入日期的格式。这是我正在使用的模式之一
^((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));
}
}
代码已经简化,但即使在这个简化版本上,它也会返回错误的结果。感谢您提出任何建议/解决方案。
答案 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)
这是因为你在年度正则表达式中有一个捕获组(一对括号)。你可以:
非捕获组在组的开头用?:
表示:
^((?:18[5-9]|19[0-9]|20[0-9])\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])$
^^--- here
请注意,环视((?= ... )
,...)也是非捕获的。