正则表达式验证 PIN 码 JS

Eld*_*der 2 javascript

我正在尝试解决此任务:

ATM 机允许 4 位或 6 位 PIN 码,PIN 码只能包含 4 位或 6 位数字。

如果函数传递了一个有效的 PIN 字符串,则返回 true,否则返回 false。

例如:

validatePIN("1234") === true validatePIN("12345") === false validatePIN("a234") === false

这是我的代码:

function validatePIN (pin) {
  if(pin.length === 4 ||  pin.length === 6 ) {
    if( /[0-9]/.test(pin))  {
      return true;
    }else {return false;}
  }else {
      return false;
      }
}
Run Code Online (Sandbox Code Playgroud)

它表明 --- 'a234' 的输出错误 - 预期:false,而不是得到:true ---为什么?这个 /[0-9]/ 只显示数字?

先感谢您 :)

Jef*_*amp 7

正如您在此正则表达式示例中 /[0-9]/所看到的,它将匹配其中任意位置至少包含 1 个数字的任何字符串。

要解决此问题,您可以使用量词来完全匹配

  • 4 个数字:[0-9]{4}
  • 6 个号码:[0-9]{6}

此外,我们希望这些正则表达式实际上匹配整个字符串,^在正则表达式的开头和$结尾使用。这将确保匹配的 PIN 码旁边不存在任何内容。
如果我们将上面的两种情况合并到一个捕获组中,并添加开始和结束分隔符,我们最终会得到以下正则表达式:

/^([0-9]{4}|[0-9]{6})$/

注意:[0-9]字符集有一个很好的简写:\d,因此正则表达式可以进一步简化为:

/^(\d{4}|\d{6})$/


这个正则表达式执行您需要的所有验证,因此您的代码validatePIN可以简化如下:

function validatePIN (pin) {
    return /^(\d{4}|\d{6})$/.test(pin);
}

console.log(validatePIN('1234')); // > true
console.log(validatePIN('123456')); // > true
console.log(validatePIN('123')); // > false
console.log(validatePIN('12345')); // > false
Run Code Online (Sandbox Code Playgroud)


raf*_*ssa 6

/[0-9]/将匹配字符串中的任何数字,因此它匹配“a234”中的“2”。你需要让它从头到尾只匹配数字:/^[0-9]+$//^\d+$/

此外,您可以仅使用正则表达式/^(\d{4}|\d{6})$/来匹配包含 4 或 6 个数字的所有字符串。

/^(\d{4}|\d{6})$/.test("1234"); // true
/^(\d{4}|\d{6})$/.test("12345"); // false
/^(\d{4}|\d{6})$/.test("123456"); // true
/^(\d{4}|\d{6})$/.test("a234"); // false
Run Code Online (Sandbox Code Playgroud)