我相信以後會用到它。
常見的信箱例子
假設我有這些信箱:
aaa@gmail.com
ccc@yahoo.com.tw
ddd@msn.com
eee@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.
是最多的,而預設是會找出「最多匹配」,但我們要少的那個,所以才要加上 ?
。
不太懂的話可以參考:正則表達式