【问题标题】:condition is met even when is false即使为假也满足条件
【发布时间】:2019-04-05 16:32:41
【问题描述】:

我正在尝试检查输入值是否为字母数字。根据 regex101.com,我的正则表达式应该可以工作。但是所有的测试结果都是“不正确的”。

我做错了什么?

var alphaNumeric = /^[a-z0-9]+$/gi;
var input = "123"; //page.input.getValue().toUpperCase();

console.log(input);

if (input.length == 3) {

  if (alphaNumeric.test(input)) {
    console.log("correct");
  } else {
    console.log("incorrect");
  }
} else {

}

【问题讨论】:

  • But all test results in "incorrect". 可以提供不起作用的示例输入吗?
  • 不是重复的。请阅读我的问题。 @RuiJarimba
  • page没有定义,getValue()是什么?
  • 有效!你得到了什么输出?

标签: javascript regex if-statement ibm-forms


【解决方案1】:

查看@bobince的回答: https://stackoverflow.com/a/2630538/1241218

您正在使用 g(全局)正则表达式。 在 JavaScript 中,全局正则表达式有状态:你调用它们(使用 exec, 测试等)第一次,你得到给定字符串中的第一个匹配项。 再次打电话给他们,你会得到下一场比赛,依此类推,直到你没有 match 并重置为下一个字符串的开头。你也可以 写 regex.lastIndex= 0 来重置这个状态。

(这当然是一个绝对糟糕的设计,保证 混淆并导致奇怪的错误。欢迎使用 JavaScript!)

您可以从 RegExp 中省略 g,因为您只测试一个 匹配。

因此,在您的情况下,每次尝试都会得到不同的结果:

    var alphaNumeric = /^[a-z0-9]+$/gi;
    var input = "123";
    console.log(input);
    if (input.length == 3) {
        for (var i=0; i<5; i++){
            if (alphaNumeric.test(input)) {
                console.log("correct");
            } else {
                console.log("incorrect");
            }
        }

    } else {
        
    }

【讨论】:

    【解决方案2】:

    摆脱全局标志(无论如何你都在匹配开始和结束)

    var alphaNumeric = /^[a-z0-9]+$/i;
    console.log(alphaNumeric.test("aaa")); // true
    console.log(alphaNumeric.test("AAA")); // true
    console.log(alphaNumeric.test("123")); // true
    console.log(alphaNumeric.test("a1a1a1")); // true
    console.log(alphaNumeric.test("ABC-123")); // false
    

    【讨论】:

    • 与接受的解决方案相同的结论,为什么不赞成?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2018-04-13
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多