我有验证号码范围的方案,它可以是多个范围或单个号码。
1号到10号可以写成(1-3,4,5-8,9,10)这里1-3表示愤怒(1,2,3)我试过java正则表达式:
Pattern.matches("^[0-9][0-9,-]*,[0-9,-]*[0-9]$","11,131-132-134,45,12--10,,10");
此模式允许连续的连字符和逗号,
有效输入
1) 1-3,4,5-8,9,10
2) 1-3,4-5,6-10
3) 1,2,3,4,5
4) 1,2-5,6
输入无效
1) ,2,3,4-10,
2) -2,3,4-10-
3) 2,3,,4-10
4) 2,3,4--10
5) 2,3,4-6-10 (Invalid range)
有人可以建议如何检查逗号和连字符不应连续出现两次,以数字开头和结尾,范围不应重复(4-8-10)
答案 0 :(得分:1)
这应该是你想要的正则表达式:
^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$
它检查以下序列:
\\d+
:一个或多个数字
(-\\d+)?
:一个可选的连字符序列,后跟一个或多个数字
(,\\d+(-\\d+)?)*
:出现零次或多次一个逗号,后跟一个或多个数字后跟一个可选的连字符序列,后跟一个或多个数字
当正则表达式在开头查找数字时,将不允许以连字符或逗号开头的字符串。
当它查找一个紧跟着连字符和逗号的数字时,一个连续的连字符或逗号的字符串,后面跟着一个逗号或反向的连字符是不允许的。
由于?
中的(-\\d+)?
允许(-\\d+)
序列恰好出现零次或一次,所以1-2-3之间的范围将不匹配。
如果您不需要单独使用一个号码,请将*
中的^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$
替换为+
。
答案 1 :(得分:0)