【问题标题】:How to validate array(matrix) format?如何验证数组(矩阵)格式?
【发布时间】:2016-10-13 20:38:43
【问题描述】:

我正在为数组乘法制作页面,我需要在操作之前验证数组格式。文本框应该只接受这种格式的数组:[[1,2,3],[4,5,6],[7,8,9]] - 行数组的矩阵数组。

我尝试使用正则表达式,但我真的做不到。有没有其他办法?

【问题讨论】:

  • 您要构建什么验证?
  • 我需要验证数组格式,应该是这样的:[[1,2,3],[4,5,6],[7,8,9]]。
  • 数组元素可以大于个位数吗?例如,[[1111,2,3],[7777,4,5],[0000,6,7]]?
  • 是的。负数也是。
  • [1, 2, 3]可以包含空格字符吗?您是否要检查是否只输入了数字?

标签: javascript arrays regex validation matrix


【解决方案1】:

试试下面给出的正则表达式

^ +\[ ([\[[ +\d+ +,]+ +] +,)+ +\[[ +\d+ ,]+ +] +]$

全部在一个最终解决方案中......

可以管理空间...

【讨论】:

  • 谢谢,但它不适用于这样的数组:[[1,2,3],[4,5,6]] 或 [[1,2,3],[4,5 ,6],[7,8,9], [10,11,12] ..
  • 等一下,让我处理这个
  • 所以这个对你的第二种情况有帮助......你在评论中输入
  • 这看起来很酷 :) 还有一件事:你能让它接受数字和数组之间的空格吗?
  • 不处理十进制数、负数、以加号开头的数字、科学计数法中的数字、换行符、制表符……
【解决方案2】:

它可以在附近

var arr = [[1,2,3],[4,5,6],[7,8,9]],
  valid = arr.every(a => Array.isArray(a) && a.length === 3 && a.every(item => typeof item === "number"));
console.log(valid);

【讨论】:

    【解决方案3】:

    您可以使用JSON.parse()Array.prototype.every()

    var res;
    try {
      res = JSON.parse(document.querySelector("input").value)
            .every(function(arr) {return arr.every(Number)});
      console.log(res);
    } 
    // handle `JSON.parse()` error
    catch (e) {
      console.log(e)
    }
    <input type="text" value="[[1,-2,3],[4,5,-6],[7,8,99999]]">

    【讨论】:

    • 非常酷..不幸的是当数组中有数组项时不起作用,例如<input type="text" value="[[[1],-2,3],[4,5,-6],[7,[8],99999]]">
    • @Redu [[[1],-2,3],[4,5,-6],[7,[8],99999]]不是OP描述的数组格式吗?
    • OP 说 Textbox 应该只接受这种格式的数组:[[1,2,3],[4,5,6],[7,8,9]]。对我来说,这意味着没有[1,{0:2},3][1,[2],3]。我想错了吗..?
    • @Redu 虽然这种格式也可以通过稍微调整答案处的javascript 来处理。
    • @Redu 不确定您是否“想错了”,尽管 OP 没有在 Question 或 cmets 中包含这些示例作为可能的输入。通过对 javascript 进行轻微调整,您共享的任何一个示例输入都可以使用相同的原始模式返回相同的结果。另请注意,您的解决方案以数组作为输入开始,而不是字符串;这将是 .value<input> 元素。
    【解决方案4】:

    虽然您已经接受了答案,但我仍然想提出这个解决方案:

    function getValidArray(txt) {
        try {
            var arr = JSON.parse(txt);
        } catch (e) {}
        return Array.isArray(arr) 
               && arr.length == 3
               && arr.every( sub => Array.isArray(arr) 
                             && sub.length === 3 
                             && sub.every ( v => typeof v == 'number' ) )
               && arr;
    }
    
    // I/O for snippet:
    
    var inp = document.querySelector('input');
    var out = document.querySelector('div');
    
    inp.oninput = function() {
        var txt = inp.value;
        var result = getValidArray(txt);
        out.textContent = result ? JSON.stringify(result) : 'invalid';    
    };
    inp.oninput();
    input { width: 100% }
    Array: <input value="  [[1,88,-45.2],     [1.2e+2, 1e-1,-0.9],[  0,22, 1.33]  ]">
    <div></div>

    当文本表示一个 3x3 的数字数组时,此测试成功。

    它将接受数字、逗号等周围出现的空格,并接受负数和十进制值,甚至科学记数法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-07-01
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多