为什么以下程序为某些输入返回错误的布尔值?

时间:2017-06-21 21:45:40

标签: javascript regex algorithm

因此程序会检查输入的号码是否是有效的美国电话号码。

它广泛使用正则表达式。

一般来说,它可以正常工作。

但对于某些输入,它会返回无效的布尔值。为什么?

输入:

  1. “1(555)555-5555”应该返回true,但实际上返回false。
  2. “(555)555-5555”应该返回true,但实际上返回false。
  3. “1(555)555-5555”应该返回true,但实际上返回false。
  4. “(6505552368)”应该返回false,但实际上返回true。
  5. “27576227382”应该返回false,但实际上返回true。
  6. “(555-555-5555”应该返回false,但实际上返回true。
  7. 以下是有效的美国电话号码格式列表:

    1. 555-555-5555
    2. (555)555-5555
    3. (555)555-5555
    4. 555 555 5555
    5. 5555555555
    6. 1 555 555 5555
    7. function telephoneCheck(str) {
        // Good luck!
        var regexArr = ["[0-9]{3}-[0-9]{3}-[0-9]{4}",
      "([0-9]{3})[0-9]{3}-[0-9]{4}",
      "1{1}([0-9]{3})[0-9]{3}-[0-9]{4}",
      "[0-9]{3} [0-9]{3} [0-9]{4}",
      "[1]{1} [0-9]{3} [0-9]{3} [0-9]{4}",
      "1 ([0-9]{3}) [0-9]{3}-[0-9]{4}",
      "[0-9]{10}"];
      
      var cond = false;
        
      for(var i = 0;i < regexArr.length;i++){
        var regexObj = new RegExp(regexArr[i], "");
        if(regexObj.test(str)){cond = true;
        break;}
      }
       
        return cond;
      }
      
      
      
      telephoneCheck("555-555-5555");

2 个答案:

答案 0 :(得分:3)

这是一个单一的正则表达式解决方案,您可以查看其railroad diagram here

Message
function telephoneCheck(str) {
  return /^(?:1(-| ?)\d{3}\1\d{3}\1\d{4}|\d{3}(-| ?)\d{3}\2\d{4}|1? ?\(\d{3}\) ?\d{3}[- ]\d{4})$/.test(str);
}

console.log("Should pass:");
console.log("1 (555) 555-5555", telephoneCheck("1 (555) 555-5555"));
console.log("(555)555-5555", telephoneCheck("(555)555-5555"));
console.log("1(555)555-5555", telephoneCheck("1(555)555-5555"));
console.log("1-555-555-5555", telephoneCheck("1(555)555-5555"));
console.log("555-555-5555", telephoneCheck("555-555-5555"));
console.log("(555)555-5555", telephoneCheck("(555)555-5555"));
console.log("(555) 555-5555", telephoneCheck("(555) 555-5555"));
console.log("555 555 5555", telephoneCheck("555 555 5555"));
console.log("1 555 555 5555", telephoneCheck("1 555 555 5555"));
console.log("5555555555", telephoneCheck("5555555555"));
console.log("Should fail:");
console.log("(6505552368)", telephoneCheck("(6505552368)"));
console.log("27576227382", telephoneCheck("27576227382"));
console.log("(555-555-5555", telephoneCheck("(555-555-5555"));
console.log("1-(555)-555-5555", telephoneCheck("1-(555)-555-5555"));
console.log("1(555)5555555", telephoneCheck("1(555)5555555"));
console.log("1 555 5555555", telephoneCheck("1 555 5555555"));
console.log("1-555-5555555", telephoneCheck("1-555-5555555"));
console.log("1 555 555-5555", telephoneCheck("1 555 555-5555"));
console.log("1-555 555 5555", telephoneCheck("1-555 555 5555"));
console.log("1555-555-5555", telephoneCheck("1555-555-5555"));
console.log("1 (555 555-5555", telephoneCheck("1 (555 555-5555"));
console.log("1 555) 555-5555", telephoneCheck("1 555) 555-5555"));
console.log("1-5555555555", telephoneCheck("1-5555555555"));

如果有人可以缩短正则表达式,请随时在评论中发帖,我会更新。

答案 1 :(得分:2)

你需要一个反向间隙\来绕圆括号(否则它们被解释为分组符号)和另一个反弹,因为你将正则表达式括在引号中,所以\\(

此外,您可以尝试将不同的正则表达式统一为一个,例如使用

"1\\s*\\([0-9]{3}\\)\\s*[0-9]{3}-[0-9]{4}"

取代

"1{1}\\([0-9]{3}\\)[0-9]{3}-[0-9]{4}"

"1 \\([0-9]{3}\\) [0-9]{3}-[0-9]{4}"

&#13;
&#13;
function telephoneCheck(str) {
  // Good luck!
  var regexArr = [
"[0-9]{3}-[0-9]{3}-[0-9]{4}",
"\\([0-9]{3}\\)[0-9]{3}-[0-9]{4}",
//"1{1}\\([0-9]{3}\\)[0-9]{3}-[0-9]{4}",
"[0-9]{3} [0-9]{3} [0-9]{4}",
"[1]{1} [0-9]{3} [0-9]{3} [0-9]{4}",
//"1 \\([0-9]{3}\\) [0-9]{3}-[0-9]{4}",
"1\\s*\\([0-9]{3}\\)\\s*[0-9]{3}-[0-9]{4}",
"[0-9]{10}"];

var cond = false;
  
for(var i = 0;i < regexArr.length;i++){
  var regexObj = new RegExp(regexArr[i], "");
  if(regexObj.test(str)){cond = true;
  break;}
}
 
  return cond;
}



console.log(telephoneCheck("1 (555) 555-5555"));
&#13;
&#13;
&#13;