使用正则表达式验证输入字符串“RX-EZ12345678912345B”

时间:2012-06-22 04:23:23

标签: java regex regex-greedy

我需要验证输入字符串,该字符串应采用以下格式:

<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter>
  

Ex:RX-EZ12345678912345B

我尝试了类似^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}之类的东西,但它没有给出预期的结果。

任何帮助将不胜感激。

由于

6 个答案:

答案 0 :(得分:1)

不确定您在当前正则表达式的开头尝试做什么。

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"

上面的正则表达式将严格匹配您指定的输入字符串。如果您使用matches功能,^$可能会被省略。

由于您需要确切的重复次数,因此您应将其指定为{<number>}{<number>,<number>}用于可变重复次数。并且?指定之前可能或的令牌 - 如果必须在那里,则指定?不正确。

答案 1 :(得分:1)

只需将您的需求转换为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
}

答案 2 :(得分:1)

^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$

这应该可以解决你的目的。您可以从here

确认

答案 3 :(得分:1)

您最大的问题是开头的[IN],它只匹配一个字母,并且只有IN。如果您想匹配任何字母中的两个,请使用[A-Z]{2}

修复后,您的正则表达式仍然只会匹配RX-E。这是因为[A-Z]{0,2}?开始尝试不消耗任何东西,这要归功于不情愿的量词,{0,2}?。然后\d{0,14}匹配零位数,[A-Z]{0,1}贪婪地消耗E

如果您想准确匹配2个字母和14个数字,请使用[A-Z]{2}\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]$

答案 4 :(得分:0)

这应该可以解决您的问题。查看有效期here

^[A-Z]{2}-[A-Z]{2}[0-9]{14}[A-Z]$

答案 5 :(得分:0)

^([A-Z]{2,2}[-]{1,1}[A-Z]{2,2}[0-9]{14,14}[A-Z]{1,1}){1,1}$