2010-07-08 135 views
0

任何人都可以告诉我如何为以下场景编写正则表达式。输入只能是数字或-(连字符)或,(逗号)。输入可以当指数值范围内给出被给定为以下任何一种用于验证的正则表达式

23 

23,26 

1-23 

1-23,24 
24,25-56,58-40,45 

此外,第二数量应该比第一个更大。 23-1不应该被允许。如果已输入号码,则不应再次允许。就像1-23,23不应该允许的那样

+0

正则表达式在值的比较中会遇到一个非常困难的时刻(不要让相同的数字超过一次,如果它的过去是一个“ - ”检查,看看它是否更小......)你可能会更好地使用JavaScript来做这件事 - 用逗号分隔列表并发现连字符等。 – 2010-07-08 19:33:10

回答

0

我认为用正则表达式最好花时间去学习它们,而不是把别人的脚本扔进你的东西而不知道它在做什么。你有优秀的资源来帮助你。

尝试这些站点:

这些都是前三个结果形成了谷歌搜索。一切都是好资源。祝你好运。记住要仔细检查你的正则表达式实际上是否匹配,通过输出到屏幕上,不要假设你知道(它已经咬了我一次以上)。

0

我不认为你可以用RegEx做到这一点。尤其不是关于设置逻辑的部分 - 已经使用的数字,有效的顺序范围。

我的建议是让正则表达式验证格式,至少是逗号,数字。然后在逗号上使用split方法,并循环输入以验证集合。例如:

var number_ranges = numbers.split(','); 
for (var i = 0; i < number_ranges.length; ++i) { 
    // verify number ranges in set 
} 

这个逻辑并不是微不足道的。

+0

[\ d] +([ - | \,] [\ d])*这是否验证格式?或者我错过了什么? – Ravinandan 2010-07-08 19:45:54

+0

** Stephen P **提供了一个很好的正则表达式。现在你只需要循环通过值和非常集。 – 2010-07-08 20:30:46

3

我不打算与“我认为”或“也许” - 你不能与正则表达式做这个。针对正则表达式

匹配可以验证输入的形式是正确的,并且也可以用于提取输入件,但它可以做值比较,或重复去除(除了在有限明确定义的情况)或范围检查。

您作为输入的内容我将解释为逗号分隔的值列表或值范围;在BNFish符号:

value :: number 
range :: value '-' value 
term :: value | range 
list :: term [','term]* 

一个正则表达式可以建立,将匹配该验证正确的结构,但你必须为数值的比较做其他验证和防止重复的号码。

最straigtforward正则表达式我能想到的(临时通知)这是

([0-9]+|[0-9]+-[0-9]+)(, *([0-9]+|[0-9]+-[0-9]+))* 

您有数字数字位数,后面可以跟逗号[可选空间(数字位数 - 数字) - 重复零次或多次。


我测试此正则表达式在http://www.fileformat.info/tool/regex.htm与输入3,4-12,6,2,90-221

当然可以代替[0-9]与[\ d]对于正则表达式的方言,允许它。

+0

非常感谢!!!!我只是在BNFish表示法的帮助下写了相同的reg exp ...再次感谢 – Ravinandan 2010-07-08 20:11:50

2
var str = "24,25-56,24, 58- 40,a 45", 
trimmed = str.replace(/\s+/g, '') 

//test for correct characters 
if (trimmed.match(/[^,\-\d]/)) alert("Please use only digits and hyphens, separated by commas.") 

//test for duplicates 
var split = trimmed.split(/-|,/) 
split.sort() 
for (var i = 0; i < split.length - 1; i++) { 
    if (split[i + 1] == split[i]) alert("Please avoid duplicate numbers.") 
} 

//test for ascending range 
split = trimmed.split(/,/) 
for (var i in split) { 
    if (split[i].match("-") && eval(split[i]) < 0) alert("Please use an ascending range.") 
}