验证获取记录的范围

时间:2014-09-22 06:56:44

标签: java regex

我正在制作一个正则表达式,需要以下格式有空格

  • 逗号分隔的字母数字值列表:DG1,D3或R4,UI2
  • 逗号分隔的字母数字和数字值列表:D1,2或D1,2
  • 字母数字值的范围:DG1-DG5 OR DG1-DG5
  • 字母数字和数值范围:DG1 - 8或DG1-8或8-DG11或8 - DG13
  • 范围和逗号分隔值的组合:DG1,DG3-DG7或DG1,DG3-DG6
  • 范围和逗号分隔的字母数字和数字值的组合:DG1,3-DG7 OR 1,DG3-6
  • 除逗号和连字符外,不允许使用其他特殊字符
  • 2个特殊字符不能合在一起
  • 无法以特殊字符开头或结尾

无效的值可能是

  • ,1,DG1
  • -DG1-5
  • DG1 - 3 - GP9
  • 1,F4,
  • RE3 -
  • 1,-G3
  • 5,S3,-9

1 个答案:

答案 0 :(得分:0)

我会用:

^([A-Z0-9]+(?:-[A-Z0-9]+)?)(?:,(?1))*$

<强>解释

^                       : Start of string
    (                   : begin group 1
        [A-Z0-9]+       : 1 or more alphanum
        (?:             : begin NON capture group
            -           : literally -
            [A-Z0-9]+   : 1 or more alphanum
        )?              : end group, optional
    )                   : end group 1
    (?:                 : begin NON capture group
        ,               : literally ,
        (?1)            : repeat regex in group 1
    )?                  : end group,optional
$

如果(?1)不起作用,则必须复制相关部分:

^[A-Z0-9]+(?:-[A-Z0-9]+)?(?:,[A-Z0-9]+(?:-[A-Z0-9]+)?)*$

如果你想处理可选空格:

^\s*[A-Z0-9]+(?:\s*-\s*[A-Z0-9]+)?(?:\s*,\s*[A-Z0-9]+(?:\s*-\s*[A-Z0-9]+)?)*\s*$