java正则表达月份2位数

时间:2013-01-25 16:16:01

标签: java regex

我只想抓住以下其中一项:

01 , 02 , ... , 09 , 10 , 11 , 12

以下正则表达式是完整的还是我错过了什么?

String monthPat = "^[1][0-2]|[0][1-9]$"

2 个答案:

答案 0 :(得分:9)

当前正则表达式的问题在于,通过替换,您尝试匹配以下表达式之一:

^[1][0-2]     # strings that start with '10', '11', or '12'
[0][1-9]$     # strings that end with '01' through '09'

这意味着您可以使用较长字符串的部分匹配,例如,您将匹配“1000”开头的“10”和“2009”结尾处的“09”。

确保在|的每一侧都包含两个锚点以解决此问题:

^1[0-2]$|^0[1-9]$

或者,您可以在组内进行交替并将锚点放在外面:

^(1[0-2]|0[1-9])$

请注意,我还从[1][0]删除了字符类(方括号),因为含义相同。

答案 1 :(得分:1)

从我看到的,你正在进行验证。如果您在String类中使用matches方法执行它们,则锚点^$是不必要的。

你可以缩短一点,因为当只有一个字符时不需要字符类:

"1[0-2]|0[1-9]"

如果在String类中使用matches方法,则可以使用上面改进的正则表达式,因为如果提供的模式与整个字符串匹配,matches方法将返回true

请注意,如果单独考虑正则表达式,则其正则含义略有不同。

"^[1][0-2]|[0][1-9]$"

如果您将其提供给Pattern.compile,然后使用Matcher.find类,这将匹配以10到12开头的子字符串,或者以01到09结尾,因为交替将在2个子图案之间交替: ^[1][0-2][0][1-9]$。将其更改为

"^(?:1[0-2]|0[1-9])$"

如果字符串正好是01到12,它将只找到匹配。

当您使用其他语言编写代码时,此知识非常有用,因为如果您没有指定锚点{{1},那么使用正则表达式的String类/实用程序的match方法可能会返回与正则表达式匹配的子字符串}和^