首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式不包含两个或多个连续的逗号或连字符,并且数字之间最多包含一个连字符

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

Stack Overflow用户
提问于 2016-08-31 17:40:29
回答 2查看 481关注 0票数 0

我有验证数字范围的场景,它可以是多个范围或单个数字。

Ex1到10可以写成( 1-3 ,4,5-8,9,10)这里1-3表示rage (1,2,3)我已经尝试过java regex:

代码语言:javascript
运行
复制
Pattern.matches("^[0-9][0-9,-]*,[0-9,-]*[0-9]$","11,131-132-134,45,12--10,,10");

此模式允许连续的连字符和逗号,

有效输入

代码语言:javascript
运行
复制
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

无效输入

代码语言:javascript
运行
复制
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)

EN

回答 2

Stack Overflow用户

发布于 2016-08-31 18:11:37

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

代码语言:javascript
运行
复制
^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$

它检查以下序列:

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

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

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

由于正则表达式在开头查找数字,因此不允许使用以连字符或逗号开头的字符串。

当它查找后面紧跟连字符和逗号的数字、具有连续连字符或逗号的字符串、紧跟逗号的连字符或反之时,不允许这样做。

由于(-\\d+)?中的?恰好允许(-\\d+)序列出现零次或一次,因此不会匹配像1-2-3这样的范围。

如果您不需要单独允许单个数字,请将^\\d+(-\\d+)?(,\\d+(-\\d+)?)*$中的*替换为+

票数 1
EN

Stack Overflow用户

发布于 2016-08-31 17:56:34

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

代码语言:javascript
运行
复制
(?:\\d+(?:-\\d+)?,)+(?:\\d+(?:-\\d+)?$)

Live demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39246040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档