正则表达式验证PIN码JS

时间:2018-03-08 18:07:39

标签: javascript

我试图解决这个问题:

  

ATM机允许4或6位PIN码,PIN码不能包含   除了4位数或正好6位数之外的其他任何东西。

     

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

     

例如:

     

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;
      }
}

它显示了 - ' a234'错误的输出。 - 预期:错误,而不是:真的---为什么?这个/ [0-9] /只显示数字?

提前谢谢你:)

7 个答案:

答案 0 :(得分:2)

/[0-9]/将匹配字符串中的任何数字,因此它匹配" 2" in" a234"。您需要使其仅匹配数字,从头到尾:/^[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

答案 1 :(得分:0)

  

查看代码

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

console.log(validatePIN("1234"));
console.log(validatePIN("a234"));
console.log(validatePIN("12345"));
console.log(validatePIN("123456"));

  

说明:

  1. 您无需手动检查长度,正则表达式可以执行此操作,例如{4} or {6}
  2. 您可以使用\d代替[0-9],这是一个简短的手段
  3. 正则表达式需要端到端,即应使用^ ... $指定开头和结尾

答案 2 :(得分:0)

因为您没有指定号码所在的位置。

如果你的表达中有一个数字,那么你现在正在检查的是真的。

要纠正这种行为,您需要执行此操作:

/^[0-9]+$/.test(pin)

有了这个,你就是说“数字”应该以数字开头,包含和结尾。

答案 3 :(得分:0)

正如您所看到的,in this regex example /[0-9]/将匹配任何位置至少包含1个数字的字符串。

相反,你应该使用量词来完全匹配

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

此外,我们希望这些正则表达式实际匹配整个字符串,在开始时使用^,在正则表达式结尾使用$。这将确保匹配的密码旁边不存在任何内容 如果我们将上述2个案例合并到捕获组中,并添加起始分隔符和结束分隔符,我们最终得到此正则表达式:

/^([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

答案 4 :(得分:0)

您只需使用此正则表达式/^(\d{4}|\d{6})$/来验证pin。

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

console.log(validate('1234'));
console.log(validate('123a'));
console.log(validate('1234a'));
console.log(validate('123412'));

答案 5 :(得分:0)

您可以使用正则表达式

^(?:{4} | {6})(= [0-9] * $?)$

解释

 ^ # Start of string
     (?= # Assert that the following regex can be matched here: 
    [0-9]* # any number of digits (and nothing but digits) 
    $ # until end of string ) # (End of lookahead) 
    (?: # Match either 
    .{4} # 8 characters | # or 
    .{6} # 11 characters ) # (End of alternation) 
    $ # End of string

答案 6 :(得分:0)

JAVA:对照数字数组检查每个PIN码,并相应地填充一个布尔循环。如果最后的布尔循环不是全部为true,则返回false。

public static boolean validatePin(String pin) {

String[] arr1 = pin.split("");
String[] num = {"1","2","3","4","5","6","7","8","9","0"};
boolean[] bool = new boolean[arr1.length];


if(arr1.length != 6 && arr1.length != 4){
  return false;
}



for(int i = 0; i< arr1.length; i++){

    for(int j = 0; j<num.length; j++){

        if(arr1[i].equals(num[j])){
            bool[i] = true;
        }

    }

}

for(int i = 0; i <bool.length; i++){

  if(bool[i] == false){
    return false;
  }

}

return true;

}