怎麼用正則表達式限制連續次數

覺得還蠻陷阱的東西。

重要觀念

如果你有限制上限或下限的規則的需求,例如說「最多出現 2 個英文字」或是「最多 8 個數字」之類的,那你一定要用 ^$ 來建立字首跟字尾的規則,才有辦法真的限制在「你指定的範圍」。

參考下面的例子會比較好理解。

1. 身分證號碼

假設規則是「開頭 A 到 Z,加上 9 個連續數字」,你必須這樣寫:

1
2
3
const rule = /^[A-Z][0-9]{9}$/
console.log(rule.test('A123456789')) // true
console.log(rule.test('A1234567891011')) // false

如果不這樣寫,現在把 $ 拿掉的話,超出 9 個數字也會得到 true:

1
2
3
const rule = /^[A-Z][0-9]{9}/
console.log(rule.test('A123456789')) // true
console.log(rule.test('A1234567891011')) // true

為什麼會這樣?

你可能會想說不是「A-Z 開頭後面跟著連續 9 個數字」這個規則嗎?這是因為正則表達式所配對的是「部分」的字串,意思是說只要字串裡面有一部分符合,就會被匹配到。

A1234567891011 裡面的 A123456789 符合規則,所以才能配對成功。

就像如果有個規則是:/\d{9}/ 匹配「連續九個數字」的字串。當數字是 1234567891011 時,裡面的 123456789 的連續 9 個數字,只看 567891011 的話也符合連續 9 個數字。只要能排成 9 個連續的數字都會被當作符合。

而加上 $ 就能夠限制的原因是因為規則變成:以連續 9 個數字結尾

這個「結尾」是一個很重要的規則,因為這會讓規則變成一定要「結尾剛好出現 9 個數字」才會符合。1234567891011 沒辦法再像剛剛一樣拆成 123456789567891011,因為那都不符合以連續 9 個數字 結尾 的這個規則。

2. 手機號碼

接下來是做個實際練習,請先試著先自己思考,在看解答。

假設手機號碼的規則是「09 開頭 + 8 個連續數字」該怎麼寫?

1
2
3
const rule = /^09[0-9]{8}$/
console.log(rule.test('0912345678')) // true
console.log(rule.test('091234567890')) // false

如果能順利解出來的話應該就沒什麼問題了。

做個最後的補充,有時候你可能會寫到混淆,所以會想說 09 前面的 ^ 是不是可以拿掉?但正確答案是 不可以,如果拿掉的話會變成 AA0912345678 也能得到 true。

總而言之,正則表達就是一個多寫多練習會比較抓到感覺的東西 QQ

把字串轉成數字的 4 種方法 mentor-program-day16
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×