正则表达式不包含两个或多个连续的逗号或连字符,并且在数字之间最多只有一个连字符

时间:2016-08-31 09:40:29

标签: java regex

我有验证号码范围的方案,它可以是多个范围或单个号码。

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)

2 个答案:

答案 0 :(得分:1)

这应该是你想要的正则表达式:

^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$

它检查以下序列:

\\d+:一个或多个数字

(-\\d+)?:一个可选的连字符序列,后跟一个或多个数字

(,\\d+(-\\d+)?)*:出现零次或多次一个逗号,后跟一个或多个数字后跟一个可选的连字符序列,后跟一个或多个数字

当正则表达式在开头查找数字时,将不允许以连字符或逗号开头的字符串。

当它查找一个紧跟着连字符和逗号的数字时,一个连续的连字符或逗号的字符串,后面跟着一个逗号或反向的连字符是不允许的。

由于?中的(-\\d+)?允许(-\\d+)序列恰好出现零次或一次,所以1-2-3之间的范围将不匹配。

如果您不需要单独使用一个号码,请将*中的^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$替换为+

答案 1 :(得分:0)

重复组是验证重复序列字符串的简单方法:

(?:\\d+(?:-\\d+)?,)+(?:\\d+(?:-\\d+)?$)

Live demo