我需要验证应该采用以下格式的输入字符串:
<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter>
例如:RX-EZ12345678912345B
我尝试了这样的事情,^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}
但它没有给出预期的结果。
任何帮助将不胜感激。
谢谢
我需要验证应该采用以下格式的输入字符串:
<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter>
例如:RX-EZ12345678912345B
我尝试了这样的事情,^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}
但它没有给出预期的结果。
任何帮助将不胜感激。
谢谢
不确定您在当前正则表达式的开头要做什么。
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
上面的正则表达式将严格匹配您指定的输入字符串。如果使用matches
函数,^
则$
可以省略。
由于您需要准确的重复次数,因此应将其指定为{<number>}
only。{<number>,<number>}
用于可变重复次数。并?
指定之前的标记可能出现也可能不出现 - 如果它必须在那里,那么指定?
是不正确的。
只需将您的要求转换为 java 正则表达式:
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
这将允许您使用:
if (!input.matches("^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$")) {
// do something because input is invalid
}
^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$
这应该可以解决您的目的。您可以从这里确认
你最大的问题是[IN]
开头的,它只匹配一个字母,而且只有它是I
or N
。如果要匹配任意字母中的两个,请使用[A-Z]{2}
.
一旦你解决了这个问题,你的正则表达式仍然只会匹配RX-E
. 那是因为[A-Z]{0,2}?
开始尝试不消耗任何东西,这要归功于不情愿的量词,{0,2}?
. 然后\d{0,14}
匹配零位,并[A-Z]{0,1}
贪婪地消耗E
.
如果要精确匹配 2 个字母和 14 个数字,请使用[A-Z]{2}
and \d{14}
。并且由于您正在验证字符串,因此您应该以结束锚点结束正则表达式,$
. 结果:
^[A-Z]{2}-[A-Z]{2}\d{14}[A-Z]$
...或者,作为 Java 字符串文字:
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
正如@nhahtdh 所观察到的,如果您使用Java 的方法来应用正则表达式,则实际上不必使用锚点matches()
,但我还是建议您这样做。它可以更好地传达您的意图,并使正则表达式可移植,以防您必须在不同的风格/上下文中使用它。
编辑:如果前两个字符应该是完全IN
的,那就是
^IN-[A-Z]{2}\d{14}[A-Z]$
这应该可以解决您的问题。在这里查看有效性
^[A-Z]{2}-[A-Z]{2}[0-9]{14}[A-Z]$
^([A-Z]{2,2}[-]{1,1}[A-Z]{2,2}[0-9]{14,14}[A-Z]{1,1}){1,1}$