覺得還蠻陷阱的東西。
重要觀念
如果你有限制上限或下限的規則的需求,例如說「最多出現 2 個英文字」或是「最多 8 個數字」之類的,那你一定要用 ^
或 $
來建立字首跟字尾的規則,才有辦法真的限制在「你指定的範圍」。
參考下面的例子會比較好理解。
1. 身分證號碼
假設規則是「開頭 A 到 Z,加上 9 個連續數字」,你必須這樣寫:
1 | const rule = /^[A-Z][0-9]{9}$/ |
如果不這樣寫,現在把 $
拿掉的話,超出 9 個數字也會得到 true:
1 | const rule = /^[A-Z][0-9]{9}/ |
為什麼會這樣?
你可能會想說不是「A-Z 開頭後面跟著連續 9 個數字」這個規則嗎?這是因為正則表達式所配對的是「部分」的字串,意思是說只要字串裡面有一部分符合,就會被匹配到。
A1234567891011
裡面的 A123456789
符合規則,所以才能配對成功。
就像如果有個規則是:/\d{9}/
匹配「連續九個數字」的字串。當數字是 1234567891011
時,裡面的 123456789
的連續 9 個數字,只看 567891011
的話也符合連續 9 個數字。只要能排成 9 個連續的數字都會被當作符合。
而加上 $
就能夠限制的原因是因為規則變成:以連續 9 個數字結尾
這個「結尾」是一個很重要的規則,因為這會讓規則變成一定要「結尾剛好出現 9 個數字」才會符合。1234567891011
沒辦法再像剛剛一樣拆成 123456789
或 567891011
,因為那都不符合以連續 9 個數字 結尾 的這個規則。
2. 手機號碼
接下來是做個實際練習,請先試著先自己思考,在看解答。
假設手機號碼的規則是「09 開頭 + 8 個連續數字」該怎麼寫?
1 | const rule = /^09[0-9]{8}$/ |
如果能順利解出來的話應該就沒什麼問題了。
做個最後的補充,有時候你可能會寫到混淆,所以會想說 09 前面的 ^
是不是可以拿掉?但正確答案是 不可以,如果拿掉的話會變成 AA0912345678
也能得到 true。
總而言之,正則表達就是一個多寫多練習會比較抓到感覺的東西 QQ