0

我有一个输入字段。

在此字段内,用户只能输入此格式的文本

1+1+2+3

最大1+1+1+1+1+1+1+1+1+1+1+1(12x)

我如何检查这个只检查数字 var isnum = /^\d+$/.test($(this).val()); 将是一半的工作,但更多我不知道如何......

4

1 回答 1

4

您可以使用量词来表示接受多少,因此:

var isnum = /^\d+(?:\+\d+){0,11}$/.test($(this).val());

这表示在开头接受任意数量的数字,可选地后跟 0 到 11 个示例+和任意数量的数字。

现场示例:

function test(str, expect) {
  var result = /^\d+(?:\+\d+){0,11}$/.test(str);
  console.log(str, result, !result === !expect ? "Test:Pass" : "Test:FAIL");
}

test("1", true);
test("1+2+3+4+1234", true);
test("1+1+1+1+1+1+1+1+1+1+1+1", true);
test("1+1+1+1+1+1+1+1+1+1+1+1+1", false);

在您添加的评论中:

es 只有数字和加号,输入数字的最大值必须为 = 12、6+6 或 3+6+3...

那是完全不同的事情,您无法使用正则表达式合理地对其进行测试(您需要大量可笑的替代方案)。相反,使用正则表达式(例如上面的)来测试格式,然后求和:

if (/*...the format is good...*/) {
    sum = str.split("+").reduce((a, b) => Number(a) + Number(b));
    if (sum > 12) {
        // disallow it
    }
}

现场示例:

function test(str, expect) {
  var result = /^\d+(?:\+\d+){0,11}$/.test(str);
  if (result) {
    result = str.split("+").reduce((a, b) => Number(a) + Number(b)) <= 12;
  }
  console.log(str, result, !result === !expect ? "Test:Pass" : "Test:FAIL");
}

test("1", true);
test("1+2+3+4+1234", false); // sum > 12
test("1+1+1+1+1+1+1+1+1+1+1+1", true);
test("1+1+1+1+1+1+1+1+1+1+1+1+1", false); // too many
test("12345", false); // sum > 12

我曾经Number(x)将字符串转换为数字,但是你有很多选择,我在这个答案中详细说明。

于 2019-02-13T11:08:41.343 回答