Validate US Telephone Numbers
What is "Regular Expression" ?
Regular expressions 正則表達式被用來根據某種匹配模式來尋找strings中的某些單詞。
舉例:如果我們想要找到字符串The dog chased the cat中單詞 the,我們可以使用下面的正則表達式:
var regex = /the/gi;
我們可以把這個正則表達式分成幾段:
/ 是這個正則表達式的頭部
the 是我們想要匹配的模式
/ 是這個正則表達式的尾部
g 代表著 global(全局),意味著返回所有的匹配而不僅僅是第一個/匹配多次。
i 代表著忽略大小寫,意思是當我們尋找匹配的字符串的時候忽略掉字母的大小寫。
. ⇒ 驗證匹配任何符號,除了換行符號(newLine)以外
\s ⇒ 驗證匹配空格
\w ⇒ 驗證匹配任何字母與數字
\d ⇒ 驗證匹配任何數字
^ ⇒ 字串必須以指定的模式開啟(需以指定符號起始) ex:/^\d/ 字串的開頭必須要有一個數字
$ ⇒ 字串必須以指定的模式結束 ex:/cat$/字串需以cat結尾
() ⇒ 將字串拆解,依格式分開判斷
? ⇒ 出現0次或1次
* ⇒ 出現0次或多次
+ ⇒ 出現1次或多次
[^abc]⇒ 不為abc的字串 {} ⇒ 大括號前面的character必須以指定的次數出現 ex:/\d{3}/ 數字出現3次
{n,} ⇒該字元出現至少 n 次 {,n} ⇒該字元出現最多 n 次 {x,y} ⇒該字元出現x~y次 | (alternative) ⇒ 跟or邏輯不一樣,只有一個 "|" ,提供一種可以讓programer 選擇的驗證或匹配模式
exp: this|that ex: (small | medium | large) 提供可供多種選擇的驗證匹配模式,不管small或medium還是large任一種都符合驗證規則 (red | blue) pill ⇒不管red pill或blue pill都符合驗證規則
function telephoneCheck(str) {
// Good luck!
var regex1= /(^1\s{1}\d{3}\s{1}\d{3}\s{1}\d{4})/; //1 555 555 5555
var regex2 = /(^1\s{1}\d{3}-\d{3}-\d{4})/; //1 555-555-5555
var regex3 = /(^[(]{1}\d{3}[)]{1}\d{3}-\d{4})/; //(555)555-5555
var regex4 = /(^1[(]{1}\d{3}[)]{1}\d{3}-\d{4})/; //1(555)555-5555
var regex5 = /(^\d{3}-\d{3}-\d{4}$)|(^\d{10}$)/; //555-555-5555 or 5555555555
var regex6 = /(^1\s[(]{1}\d{3}[)]{1}\s\d{3}-\d{4})/; //1 (555) 555-5555
return regex1.test(str) || regex2.test(str) || regex3.test(str)
|| regex4.test(str) || regex5.test(str) || regex6.test(str) ;
}
telephoneCheck("555-555-5555");
Hint
測試的正確結果
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.
Solution:
依照美國的電話格式進行驗證語法如上述所說,要注意的是在regex裡面撰寫格式時需留意空白,以及特殊符號轉譯(. - + \ ...etc)Application of Regular Expression
需要用到正規表示式的東西太多了,舉凡輸入的資料有特定的規格或格式(format)或規律者皆是,Ex:電話、E-mail、url address、IP address、任何卡的卡號、日期/時間、使用者資料輸入驗證等等,以下就E-mail驗證做進一步說明
E-mail驗證
Pattern: [email protected] DomainSuffix(2~3 characters)
Exp: /^[\w\.\+_-]+@[\w-]+(\.\w{2,3})+$/
\.為將.轉義為普通的email之間的點的用途,用\跳脫(escape)原本正規表示式中的代表任何符號的功能
ex : [email protected](包含底線符號)
[email protected]((domainprefix包含-號)
[email protected](LocalName包含+號)
[email protected](LocalName包含.號)