【问题标题】:regular expression not containing two or more consecutive comma or hyphen and between numbers at most one hyphen正则表达式不包含两个或多个连续的逗号或连字符,并且数字之间最多有一个连字符
【发布时间】:2016-08-31 09:40:28
【问题描述】:

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

Ex number 1 到 10 可以写成 (1-3,4,5-8,9,10) 这里 1-3 表示愤怒 (1,2,3) 我试过 java regex :

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-9][0-9,-]*[0-9]$"
  • ^\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*$ - 但是反向范围呢,比如8-5?您无法使用正则表达式验证数字顺序。
  • @GovindMadhu 您的正则表达式允许例如 1,,3 这是 OP 的无效选项。
  • 您不应该添加 <br> 标签来表示帖子中的换行符。这是一个降价编辑器。 @GovindMadhu
  • @revo :我没有添加它们。在我之前编辑的人补充说。我忘了删除它。

标签: java regex


【解决方案1】:

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

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

它检查以下序列:

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

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

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

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

因为它寻找一个数字后紧跟一个连字符和逗号,一个有连续连字符或逗号的字符串,一个连字符紧跟一个逗号或反之是不允许的。

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

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

【讨论】:

    【解决方案2】:

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

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

    Live demo

    【讨论】:

      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多