当前位置: 首页 > 知识库问答 >
问题:

验证数字范围

乐正迪
2023-03-14

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

即。

  • 1, 2, 3, 5, 6, 7, 9有效
  • 1-3, 5-7, 9有效
  • 2,2,6无效
  • 2,无效
  • 1, 2, 3, 4, 15, 6, 7, 385无效,因为最后一个数字大于384

我尝试了以下RegEx模式,但还不够:

/^(?!.*(\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]))*$/

共有3个答案

东郭源
2023-03-14

对于只使用正则表达式来说,这不是一个很好的用例。除了使用正则表达式之外,还需要应用一些逻辑。

对于eg.

  • 将各个表达式拆分为
贡念
2023-03-14

你可以试试这个-

function isValid(str) {
  let lower = 1, upper = 384;
  
  // Removing the unnecessary spaces
  str = str.replace(/\s/g, '');
  
  // Split the string by comma (,)
  const nums = str.split(',');
  const track = {};
  
  // Visit the numbers
  for (const num of nums) {
    
    // Check if any number contains a dash (-)
    if (/\-/.test(num)) {
      
      // If has dash then split by dash and get the upper and lower bounds.
      const [l, u] = num.split('-').map(x => x * 1);
      
      // Visit from lower to upper bound
      for (let i = l; i <= u; i++) {
        
        // If any number of the range doesn't exceed the upper
        // or lower bound i.e. [1, 384] range and did not
        // appear before then track this number.
        // otherwise return false i.e. mark it as invalid.
        if (i >= lower && i <= upper && track[i] === undefined) {
          track[i] = true;
        } else {
          return false;
        }
      }
      
    } else {
      
      // Checking again if it exceed the range [1, 384] or appears before.
      if (num * 1 >= lower && num * 1 <= upper && track[num] === undefined) {
        track[num] = true;
      } else {
        return false;
      }
    }
  }
  
  // If everything okay then return true, i.e. valid.
  return true;
}

const strs = [
  '1, 2, 3, 5, 6, 7, 9',
  '1-3, 5-7, 9',
  '2, 2, 6',
  '2,',
  '1, 2, 3, 4, 15, 6, 7, 385',
  '1-4, 3, 7-9, 10',
  '1-100, 102, 123',
  '1-100, 102, 99'
];

for (const str of strs) {
  console.log(str + ' => ' + (isValid(str) ? 'Valid': 'Invalid'));
}
.as-console-wrapper{min-height: 100%!important; top: 0}
姜嘉荣
2023-03-14

过滤和设置可能对眼睛更容易

“1-385”也是假的吗?

const isValid = str => {
  str = str.replace(/\s+/g, "")
  const rng = str.split(",").filter(item => {
    if (item === null || item === "") return false
    if (isNaN(item)) {
      const [from, to] = item.split('-')
      return +from > 0 && +from < 385 && 
             +to   > 0 &&   +to < 385
    }
    item = +item
    return item > 0 && item < 385;
  });
  return [...new Set(rng)].join(",") === str;
};


const arr = ["1, 2, 3, 5, 6, 7, 9",
  "1-3, 5-7, 9",
  "1-385",
  "1-384",
  "2, 2, 6",
  "2,",
  "1, 2, 3, 4, 15, 6, 7, 384",
  "1, 2, 3, 4, 15, 6, 7, 385",
  "0, 2, 3"
]


const res = arr.map(str => ({ [str]: isValid(str) }));
console.log(res)
 类似资料:
  • 如何为两个数字的范围设置验证。我想将第一个数字的最大值设置为第二个数字的值,将第二个数字的最小值设置为第一个numb的值。这是我的js代码: 和超文本标记语言: 请帮忙谢谢

  • 主要内容:标签属性,JSF验证整数范围实例标签用于验证特定范围内的长值。 以下代码显示如何使用标记 - 标签属性 属性 说明 minimum 在可选范围内最小长度值 maximum 在可选范围内最大长度值 JSF验证整数范围实例 打开 NetBeans IDE 创建一个Web工程:ValidateIntRange,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文件:result.xhtml

  • 问题内容: 我目前正在创建第一个在控制台中执行的游戏。 我被要求验证可以用简单代码完成的输入。目标是输入,然后验证该数字是否为整数并且在1-4的范围内。如果可能,应使用基本算法解决该问题。 问题是它不会给我我想要的结果。当我输入字符串时,它可以工作,但是会在我输入的每个数字(包括范围内的数字)上循环播放。有人知道为什么吗? 问题答案: 因为你实例是,但从来没有给用户一个机会来改变这种情况,前两个条

  • 主要内容:标签属性,JSF验证整数范围实例标签用于验证一个浮点()值的范围。 以下代码显示如何使用标记 标签属性 属性 说明 minimum 在可选范围内最小长度值 maximum 在可选范围内最大长度值 JSF验证整数范围实例 打开 NetBeans IDE 创建一个Web工程:ValidateDoubleValueRange,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文件:resu

  • 如果给定值是一个数字,则返回 true ,否则返回false 。 使用 !isNaN() 和 parseFloat() 来检查参数是否是一个数字。使用 isFinite() 来检查数字是否是有限数。使用 Number() 来检查强制转换是否成立。 const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n

  • 我有字节数组格式的公钥。在我的数据库里。像这样 在此处输入图像描述 总是suc=false。我确信bytetoverify的值与方法符号中的输入值相同。 我不知道我用这种方式生成公钥是问题还是符号有问题。在符号方法中,我使用sh1和pkcs1,但在验证中,我只找到sh1。 每个人都能帮我吗?