[Advanced Algorithm] - Validate US Telephone Numbers

題目

若是傳入字符串是一個有效的美國電話號碼,則返回 true.正則表達式

用戶能夠在表單中填入一個任意有效美國電話號碼. 下面是一些有效號碼的例子(還有下面測試時用到的一些變體寫法):測試

555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
5555555555
1 555 555 5555

在本節中你會看見如 800-692-7753 or 8oo-six427676;laskdjf這樣的字符串. 你的任務就是驗證前面給出的字符串是不是有效的美國電話號碼. 區號是必須有的. 若是字符串中給出了國家代碼, 你必須驗證其是 1. 若是號碼有效就返回 true ; 不然返回 false.code

提示

RegExpip

測試用例

  • telephoneCheck("555-555-5555") 應該返回一個布爾值.
  • telephoneCheck("1 555-555-5555") 應該返回 true.
  • telephoneCheck("1 (555) 555-5555") 應該返回 true.
  • telephoneCheck("5555555555") 應該返回 true.
  • telephoneCheck("555-555-5555") 應該返回 true.
  • telephoneCheck("(555)555-5555") 應該返回 true.
  • telephoneCheck("1(555)555-5555") 應該返回 true.
  • telephoneCheck("1 555)555-5555") 應該返回 false.
  • telephoneCheck("1 555 555 5555") 應該返回 true.
  • telephoneCheck("1 456 789 4444") 應該返回 true.
  • telephoneCheck("123**&!!asdf#") 應該返回 false.
  • telephoneCheck("55555555") 應該返回 false.
  • telephoneCheck("(6505552368)") 應該返回 false
  • telephoneCheck("2 (757) 622-7382") 應該返回 false.
  • telephoneCheck("0 (757) 622-7382") 應該返回 false.
  • telephoneCheck("-1 (757) 622-7382") 應該返回 false
  • telephoneCheck("2 757 622-7382") 應該返回 false.
  • telephoneCheck("10 (757) 622-7382") 應該返回 false.
  • telephoneCheck("27576227382") 應該返回 false.
  • telephoneCheck("(275)76227382") 應該返回 false.
  • telephoneCheck("2(757)6227382") 應該返回 false.
  • telephoneCheck("2(757)622-7382") 應該返回 false.
  • telephoneCheck("555)-555-5555") 應該返回 false.
  • telephoneCheck("(555-555-5555") 應該返回 false.

分析思路

  1. 分析該題,主要是分析電話號碼的有效排列方式,有效的號碼規則以下:字符串

    • 分離 國家碼-區號-電話號,格式如 1-555-555-5555,其中每一個分段中間是不能被分割的,如1-55-5-555-5555是非法的;
    • 在不能分段的每一個區域中和兩頭,空格是能夠隨意加的(任意個),如:1 555 555 5555155555555555是合法的;
    • 在不能分段的每一個區域中,中劃線是能夠加一個的,如:1-555-555-55551 - 555-555 - 55551 - 555-5555555是合法的,1-555--555-5555是非法的;
    • 在區號上能夠加小括號,並且必須配對,括號中間容許出現空格在數字兩邊,如:1(555)555 55551( 555 )5555555是合法的,1 555) 555 5555是非法的;
    • 除了以上分隔符和數字,其餘任意符號都是非法的,如:1a(555)555 55551(555) 555 5555$都是非法的;
    • 數字必須限制在 10 個(無國家碼)/11個,如:1 555 5555 5555是非法的;
    • 國家碼能夠不存在,存在則必須爲1,如:(555) 555 55551 555 555 5555是合法的,而2 555 555 5555是非法的;
  2. 正則表達式編寫get

    • 數字分段匹配,[\d]{3}這樣就是匹配連續三個數字,經過該方式,能夠匹配數字分段和數字數目;
    • ? 匹配符,匹配一個或0個前面的符號,如:[-]?,匹配一個或0箇中劃線;
    • * 匹配符,匹配0個或多個前面的符號,如:[\s]*,匹配0個或多個空格;
    • ^$ 兩個符號分別表示字符串首匹配和字符串尾匹配,兩個均加入表示從串首匹配到串尾,如:^[\d]{3}[-][\d]{3}-[\d]{4}$這個正則式,555-555-5555是匹配的,但a55-555-5555555-555-55555等都是不匹配的;
      綜上,因此獲得的正則匹配表達式如代碼說明

代碼io

function telephoneCheck(str) {
  // Good luck!
  var regStr = /^[\s]*[\d]?[\s]*[-]?[\s]*[(]?[\s]*[\d]{3}[\s]*[)]?[\s]*[-]?[\s]*[\d]{3}[\s]*[-]?[\s]*[\d]{4}[\s]*$/;
  
  if (regStr.test(str)) { // 匹配數目和號碼串格式
    if ((/[(]/.test(str) && /[)]/.test(str)) || // 若是有(),檢查括號的配對
        (!(/[(]/.test(str)) && !(/[)]/.test(str)))) { // 無(),就不能存在任意括號符號
           if (str.replace(/[\s-()]*/g, "").length > 10) { // 長度判斷,判斷國家是否存在,若存在是否正確
             return (str[0] === "1");
           }
           return true;
    }  
  }
  
  return false;
}

telephoneCheck("555-555-5555");
相關文章
相關標籤/搜索