我相信以後會用到它。
常見的信箱例子
假設我有這些信箱:
aaa@gmail.comccc@yahoo.com.twddd@msn.comeee@ptt.com
如果我只想要「@ 跟 .」之間的文字,也就是:
- gamil
- yahoo
- msn
- ptt
應該怎麼做?
一般可能會想說用 match(regExp) 來做,像這樣:
1 | const regExp = /@[a-zA-Z]+\./ |
結果就拿到:[ '@yahoo.', index: 3, input: '123@yahoo.com.tw', groups: undefined ]
會發現連 @ . 一起被匹配進來了,但這不是我要的阿,該怎麼做才好呢?
在正則表達式中有一個很好用的東西叫「Capturing Groups」,會用 () 來表示,簡單來說就是把 () 中匹配的字串抓出來。所以套用剛剛的例子會變這樣:
1 | const regExp = /@([a-zA-Z]+)\./ |
這時候結果就不一樣了:
1 | [ |
第二個元素就是我們要的結果了。
所以回到一開始的例子:
1 | const regExp = /@([a-zA-Z]+)\./ |
正則表達式真的是一個很強大的東西!
進階題
上面了解之後,可以試著看能不能理解這邊段程式碼做了什麼:
1 | const regExp = /^.+@(.+?)\./ |
其實就是把剛剛的例子寫得更完整一點,讓它可以判斷信箱的格式正確,並且把想要的內容(@ 到 . 之間)抓出來。
其中用到了 ? 的部分,意思是說找出「最少匹配」, @yahoo. 是最少的, @yahoo.com. 是最多的,而預設是會找出「最多匹配」,但我們要少的那個,所以才要加上 ?。
不太懂的話可以參考:正則表達式