如何定义模式并允许模式仅在模式被破坏时重复

时间:2013-04-24 17:33:00

标签: javascript regex regular-language

我正在尝试编写一个JavaScript正则表达式,只允许以下输入:

  • 数字
  • 中间带逗号的数字
  • 中间带有连字符的数字,但后面跟着另一个数字或逗号,后跟一个数字。这种模式可以再次重复。

到目前为止,我有以下表达式:

^[0-9]$|^[0-9]+$|^[0-9](-?,?[0-9])*$

然而,这是允许1-1-1,我不想要。只有在没有后跟另一个数字 - 连字符数组合时才会出现连字符。

此链接可能有所帮助:http://regexr.com?34ljt

以下样本应评估为有效:

  

01,03,05-08,10
  01,03,05
  01,03,05-08
  01
  1,1,5-6,1,1
  1,1,5-6,1,1-3
  12,12,1-9
  1-9,5,5
  1-9,9,9,5-6
  1-2
  11-11
  11,11
  1,1
  1,1,1
  11,11,11
  1111
  1,1,1,1,1,1
  1
  56.1
  1,1
  1,3
  1,3,4,5
  1,3

以下样本应评估为无效:

  

sdfdf
  11-11-11-11
  1-1-1-1-1
  ˚F
  01,
  01,03,05-08,
  -1,4 - , - 5,8909
  1,1,1-1-1
  1,1,11-1111-1
  1-1-1
  1,...,1
  1--1
   1-
  1 ,,
  ,-1-
  DF
  -1
  ,1

2 个答案:

答案 0 :(得分:3)

很好的链接,并且提供足够的示例来彻底确定解决方案是否正确。这似乎有效:

^([0-9]+(-[0-9]+)?(,(?!$)|$))+$

http://regexr.com?34lk6

所以:数字,可选地后跟短划线和更多数字,后跟逗号(除非逗号是行尾之前的最后一个字符)或行尾。

答案 1 :(得分:2)

尝试

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

继续评论

如果存在连续范围,则阻止匹配的一种方法是添加负前瞻

(?!.*-\d+,\d+-)

所以正则表达式变成了

/^(?!.*-\d+,\d+-)\d+(-\d+)?(,\d+(-\d+)?)*$/

如果负前瞻中的模式可以匹配,则会阻止整个正则表达式匹配。使用.*以便例如<{1}}位于字符串前面的任何位置,将阻止匹配。