java正则表达式第2个月的数字
我只想捕捉以下内容之一:java正则表达式第2个月的数字,java,regex,Java,Regex,我只想捕捉以下内容之一: 01 , 02 , ... , 09 , 10 , 11 , 12 下面的正则表达式是完整的还是我遗漏了什么 String monthPat = "^[1][0-2]|[0][1-9]$" 当前正则表达式的问题是,在替换时,您试图匹配以下表达式之一: ^[1][0-2] # strings that start with '10', '11', or '12' [0][1-9]$ # strings that end with '01' throug
01 , 02 , ... , 09 , 10 , 11 , 12
下面的正则表达式是完整的还是我遗漏了什么
String monthPat = "^[1][0-2]|[0][1-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]
中删除了字符类(方括号),因为其含义是相同的。从我看到的情况来看,您正在进行验证。如果您使用String类中的匹配
方法执行这些操作,则不需要锚定^
和$
您可以将其缩短一点,因为只有1个字符时不需要字符类:
"1[0-2]|0[1-9]"
如果将上面改进的正则表达式与String类中的matches
方法一起使用,则可以使用它,因为如果提供的模式与整个字符串匹配,则matches
方法将返回true
请注意,如果单独考虑正则表达式,则其含义略有不同
"^[1][0-2]|[0][1-9]$"
如果将其馈送到模式.compile
,然后使用Matcher.find
类,这将匹配以10到12开头或以01到09结尾的子字符串,因为交替将在两个子模式之间交替:^[1][0-2]
和[0][1-9]$
。换成
"^(?:1[0-2]|0[1-9])$"
只有当字符串正好是01到12时,它才会找到匹配项
当您用其他语言编写代码时,这些知识非常有用,因为与正则表达式一起工作的String类/实用程序的
match
方法可能会返回与正则表达式匹配的子字符串,如果您不指定锚点^
和$
编写单元测试并将这些字符串和一些非法字符串馈送给它,比如13和23…@Rob我认为10
是一个有效的月份。请您自己检查一下,然后您可以要求improvements@Dave哈哈,是的,谢谢你。它能抓住上面所有的东西,但我担心它能抓住其他的东西。我不确定我是否正确使用了[]和|