正则表达式:限制允许某些字符的位置和频率

时间:2012-03-08 17:13:00

标签: java regex

我有一些我需要验证的表格编号。我已经尝试了多次尝试,但我还没有做好。虽然表格编号允许很多,但我需要施加一些限制:

应强制执行所有这些规则:

  • A-Z允许但不是必需的(见子弹4)
  • 允许但不要求
  • 0-9(见第4章)
  • 句点(小数点)和短划线(如果存在),每个表格编号只允许一次。 -
  • 最小长度是一个字符,不能是空格,短划线或句号
  • 允许多个空格,但两个空格可能不会彼此相邻;也不允许使用前导或尾随空格

这是我之前所拥有的,但并未执行上述所有规则。

[A-Z0-9]([A-Za-z0-9 -.])*[A-Z0-9]

因此,这些将是新要求下的有效表格编号的示例:

123 
123 456 
A1 IL 23 MN 
CL-100 2.0 

这些将是新要求下无效表格编号的示例:

123   456
25! 25
25-IL 30-1
aa bb CC

2 个答案:

答案 0 :(得分:0)

出于某种原因,它是否必须全部在一个正则表达式中?您可以浏览并匹配\s\s,并确保返回false。然后你可以浏览每个角色,并确保其中不超过1个是.,其中不超过一个是-。您还可以检查没有前导或尾随空格,或者您可以对用户友好并简单地修改输入。然后,您可以确保至少有一个字符,如果长度恰好是一个字符,则不是短划线或句点。

最后,由于您现在已满足所有其他条件,因此您可以将字符串与[A-Z0-9 -.]*匹配,然后您就可以得到答案。

根据你不成功的正则表达式,我怀疑你有更多你真正想要满足的条件,但希望这足以帮助你弄清楚如何自己满足它们。

答案 1 :(得分:0)

这应该有效

^([A-Z0-9]|(?! )(?!.* $)(?!.*  )(?!.*-.*-)(?!.*\..*\.)(?![.-]$)[A-Z0-9 .-]+)$

有两个部分。第一个[A-Z0-9]检查单个字符。如果它不是单个字符,则有一些排除规则(?! )(?!.* $)(?!.* )(?!.*-.*-)(?!.*\..*\.)(?![.-]$)(按顺序):不以空格开头,没有空格结尾,没有连续的双空格,没有两个-,没有两个{ {1}},没有单个字符..后跟字符串结尾。然后是“基础”模式(一个或多个)-

请注意,您必须使用其他[A-Z0-9 .-]+转义\\