3

我正在尝试编写一个 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

4

2 回答 2

3

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

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

http://regexr.com?34lk6

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

于 2013-04-24T17:45:56.793 回答
2

尝试

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

进一步的评论

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

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

所以正则表达式变成

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

如果可以匹配否定前瞻内的模式,则它会阻止整个正则表达式匹配。使用.*,以便如果-1,1-在字符串前面的任何位置找到 eg,将阻止匹配。

于 2013-04-24T17:41:11.993 回答