3

我只想捕获以下内容之一:

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

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

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

2 回答 2

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]and中删除了字符类(方括号) [0],因为含义相同。

于 2013-01-25T16:20:01.220 回答
1

从我所见,你正在做验证。如果您使用 String 类中的方法执行它们matches,那么锚点^$是不必要的。

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

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

matches如果您在 String 类中将其与方法一起使用,则可以使用上面改进的正则表达式,因为如果提供的模式与整个字符串匹配,则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,它只会找到匹配项。

当您用其他语言编写代码时,这些知识很有用,因为match如果您不指定锚点^$.

于 2013-01-25T16:20:59.333 回答