我正在尝试验证以逗号分隔的数字 1-31 的唯一列表(不重复)。
即
2,4,6,7,1 是有效输入。
2、2、6 无效
2 有效
2、无效
1,2,3,4,15,6,7,31 有效
1,2,3,4,15,6,7,32 无效
20,15,3
我试过了
^((([0]?[1-9])|([1-2][0-9])|(3[01]))(?!([0]?[1-9] ])|([1-2][0-9])|(3[01])*,\\1(?!([0]?[1-9])|([1-2][0 -9])|(3[01]))
但它接受重复数字
最佳答案
对于超过 1 位数字的数字范围,只需在周围添加单词边界
捕获组和反向引用。
这隔离一个完整的数字。
这个特定的数字范围是 1-31
^ # BOS
(?! # Validate no dups
.*
( # (1 start)
\b
(?: [1-9] | [1-2] \d | 3 [0-1] ) # number range 1-31
\b
) # (1 end)
.*
\b \1 \b
)
(?: [1-9] | [1-2] \d | 3 [0-1] ) # Unrolled-loop, match 1 to many numb's
(?: # in the number range 1-31
,
(?: [1-9] | [1-2] \d | 3 [0-1] )
)*
$ # EOS
var data = [
'2,4,6,7,1',
'2,2,6',
'2,30,16,3',
'2,',
'1,2,3,2',
'1,2,2,3',
'1,2,3,4,5,6,7,8'
];
data.forEach(function(str) {
document.write(str + ' gives ' + /^(?!.*(\b(?:[1-9]|[1-2]\d|3[0-1])\b).*\b\1\b)(?:[1-9]|[1-2]\d|3[0-1])(?:,(?:[1-9]|[1-2]\d|3[0-1]))*$/.test(str) + '<br/>');
});
关于REGEX 用逗号分隔的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45946266/