任何人都可以告诉我如何为以下场景编写正则表达式。输入应该只是数字或-
(连字符)或,
(逗号)。输入可以按以下任何一种方式给出
23
23,26
1-23
1-23,24
24,25-56,58-40,45
此外,当数字以范围给出时,第二个数字应大于第一个数字。不应允许23-1。如果已输入数字,则不应再次允许。像1-23,23不应该被允许
答案 0 :(得分:3)
我不打算用“我想”或“可能”来狡辩 - 你不能用正则表达式来做这件事。
匹配正则表达式可以验证输入的表单是否正确,还可以用于提取输入的部分,但它可以不执行值比较,或重复消除(除非在明确限定的情况下),或范围检查。
您输入的内容我将其解释为以逗号分隔的值列表或值范围;用BNFish表示法:
value :: number
range :: value '-' value
term :: value | range
list :: term [','term]*
可以构建与此匹配的正则表达式以验证正确的结构,但是您必须对值比较进行其他验证并防止重复的数字。
我能想到的最简单的正则表达式(在短时间内)就是这个
([0-9]+|[0-9]+-[0-9]+)(, *([0-9]+|[0-9]+-[0-9]+))*
您有数字或位数字,可选地后跟逗号[可选空格](数字或数字 - 数字) - 重复零次或多次。
我使用输入3,4-12,6,2,90-221
当然,您可以将[0-9]替换为[\ d],用于允许它的正则表达式方言。
答案 1 :(得分: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.")
}
答案 2 :(得分:0)
我认为使用正则表达式最好花些时间来学习它们,而不是把别人的脚本扔进你的脚本而不知道它到底在做什么。你有很好的资源来帮助你。
试试这些网站:
这是谷歌搜索的前三个结果。一切都是好资源。祝好运。记得通过将其输出到屏幕来仔细检查你的正则表达式实际匹配的内容,不要假设你知道(这已经咬了我一次以上)。
答案 3 :(得分:0)
我认为您无法通过RegEx执行此操作。特别是关于设置逻辑的部分 - 已使用的数字,有效的顺序范围。
我的建议是让Regex验证格式,至少 - ,数字,逗号。然后在逗号上使用split
方法并循环输入以验证集合。类似的东西:
var number_ranges = numbers.split(',');
for (var i = 0; i < number_ranges.length; ++i) {
// verify number ranges in set
}
这种逻辑并非完全无足轻重。