首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证逗号分隔的唯一数字列表的Regex

验证逗号分隔的唯一数字列表的Regex
EN

Stack Overflow用户
提问于 2017-08-29 14:34:02
回答 5查看 1.4K关注 0票数 2

我试图验证一个逗号分隔列表的数字1-7唯一(不重复)。

  • 2,4,6,7,1是有效的输入。
  • 2,2,6无效
  • 2有效
  • 2,无效
  • 1,2,3,4,5,6,7,8无效(只有7个号码)

我试过^[1-7](?:,[1-7])*$,但它接受重复的数字

代码语言:javascript
复制
var data = [
  '2,4,6,7,1',
  '2,2,6',
  '2',
  '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 ' + /(?!([1-7])(?:(?!\1).)\1)^((?:^|,)[1-7]){1,7}$/.test(str) + '<br/>');
  });

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-08-29 17:16:44

你离我很近。

代码语言:javascript
复制
 ^                    # BOS
 (?!                  # Validate no dups
      .* 
      ( [1-7] )            # (1)
      .* 
      \1 
 )
 [1-7]                # Unrolled-loop, match 1 to 7 numb's
 (?:
      , 
      [1-7] 
 ){0,6}
 $                    # EOS

代码语言:javascript
复制
var data = [
  '2,4,6,7,1',
  '2,2,6',
  '2',
  '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 ' + /^(?!.*([1-7]).*\1)[1-7](?:,[1-7]){0,6}$/.test(str) + '<br/>');
  });

输出

代码语言:javascript
复制
2,4,6,7,1 gives true
2,2,6 gives false
2 gives true
2, gives false
1,2,3,2 gives false
1,2,2,3 gives false
1,2,3,4,5,6,7,8 gives false

对于超过1位的数字范围,只需添加单词边界

捕获组和反向引用。

这就分离了一个完整的数字。

这个特别的一个是麻木范围1-31。

代码语言:javascript
复制
 ^                                       # 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 7 numb's
 (?:                                     # in the number range 1-31
      , 
      (?: [1-9] | [1-2] \d | 3 [0-1] )
 ){0,6}
 $                                       # EOS

代码语言:javascript
复制
    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])){0,6}$/.test(str) + '<br/>');
      });

票数 1
EN

Stack Overflow用户

发布于 2017-08-29 15:00:54

Regex不适合这种情况。您应该将列表拆分为一个数组,并尝试不同的条件:

代码语言:javascript
复制
function isValid(list) {
    var arrList = list.split(",");
    if (arrList.length > 7) { // if more than 7, there are duplicates
        return false;
    }
    var temp = {};
    for (var i in arrList) {
        if (arrList[i] === "") return false; // if empty element, not valid
        temp[arrList[i]] = "";
    }
    if (Object.keys(temp).length !== arrList.length) { // if they're not of same length, there are duplicates
        return false;
    }
    return true;
}
console.log(isValid("2,4,6,7,1")); // true
console.log(isValid("2,2,6")); // false
console.log(isValid("2")); // true
console.log(isValid("2,")); // false
console.log(isValid("1,2,3,4,5,6,7,8")); // false
console.log(isValid("1,2,3")); // true
console.log(isValid("1,2,3,7,7")); // false

票数 3
EN

Stack Overflow用户

发布于 2017-08-29 15:39:18

不需要RegEx:

这比复杂的正则表达式更易于维护和显式。

代码语言:javascript
复制
function isValid(a) {
  var s = new Set(a);
  s.delete(''); // for the hanging comma case ie:"2,"
  return a.length < 7 && a.length == s.size;
}

var a = '2,4,6,7,1'.split(',');
alert(isValid(a)); // true
a = '2,2,6'.split(',');
alert(isValid(a)); // false
a = '2'.split(',');
alert(isValid(a)); // true
a = '2,'.split(',');
alert(isValid(a)); // false
'1,2,3,4,5,6,7,8'.split(',');
alert(isValid(a)); // false
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45941868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档