跳到主要內容跳到頁尾

電話、地址、單號、Email:四種混亂文字的 REGEX 實戰整理

7 分鐘閱讀Lv.4 進階摘要與日期

拿一份客服回饋的混亂文字,用 REGEXEXTRACT、REGEXMATCH、REGEXREPLACE 擷取台灣手機與市話、拆出縣市與行政區、抓訂單單號、取出 Email 網域,最後用 ARRAYFORMULA 處理整欄。

發布 更新

文章目錄

客服同事把一整份客戶回饋丟給我,說:「裡面的電話、地址、單號跟 Email 幫我拆出來。」打開來看,每一格都是一整句話,要找的東西散在句子的前面、中間、後面,格式也不一致。

這篇用四個小任務,一個一個把資料拆乾淨。REGEXMATCH、REGEXEXTRACT、REGEXREPLACE 與 ^、\d、+ 這些符號的基本用法,在 正規表示式入門 講過了,這邊直接開始用。

文章裡的電話、地址、單號、信箱都是我編的示意資料:手機是 0912-345-678 這種一看就是假的,信箱網域用保留給範例的 example.com。

手機與市話

先看原始資料,放在 A2:A6:

A
1回饋內容
2訂購蘋果紅茶,請打 0912-345-678 確認
3電話 0987-654-321,下午不在
4市話 02-1234-5678 分機 15
5手機 0900-000-123 或 (04)1234-5678
6沒留電話

台灣手機是 09 開頭、後面 8 位數字,常見寫成 09xx-xxx-xxx。規則寫成 09\d{2}-\d{3}-\d{3}:09、兩個數字、減號、三個數字、減號、三個數字。

Google 試算表公式
fx

抓出手機號碼,沒有就留空

=IFERROR(REGEXEXTRACT(A2, "09\d{2}-\d{3}-\d{3}"), "")

來看看 B2 到 B6 的結果:

列手機
20912-345-678
30987-654-321
4(空白)
50900-000-123
6(空白)

市話的區碼是 0 開頭加 1 到 2 位數字(02、04 這種),區碼可能被括號框起來,區碼後面的減號也可有可無。這條規則只涵蓋區碼後面接「4 碼-4 碼」的 8 碼本地號碼,其他碼數不同的地區要另外調整規則。規則是 \(?0\d{1,2}\)?-?\d{4}-\d{4},其中 \(? 代表「有一個左括號,或沒有」,前面加反斜線是因為括號本身有特殊意思。

Google 試算表公式
fx

抓出市話,沒有就留空

=IFERROR(REGEXEXTRACT(A2, "\(?0\d{1,2}\)?-?\d{4}-\d{4}"), "")

來看看 C2 到 C6 的結果:

列市話
2(空白)
3(空白)
402-1234-5678
5(04)1234-5678
6(空白)

第 5 列同時有手機跟市話,兩條規則各抓各的,互不影響。我習慣手機、市話分成兩欄,之後要打電話或做篩選都比較方便。

這邊保留減號是為了方便閱讀。就算規則改成抓連續 10 位數字,REGEXEXTRACT 回傳的仍是文字,開頭的 0 會保留。若後續用 VALUE 或數值運算轉型,0 才可能消失;型別差異在 進階陷阱 有說明。

地址拆成縣市與行政區

地址放在 A2:A7:

A
1地址
2台北市信義區松壽路 12 號 5 樓
3新北市板橋區文化路 3 段 8 號
4桃園市中壢區中正路 7 號
5新竹縣竹北市光明六路 21 號
6花蓮縣花蓮市中山路 9 號
7嘉義市東區中山路 15 號

台灣的縣市名稱都是兩個字加「市」或「縣」,行政區則是一到三個字加「區、鄉、鎮、市」。把它寫成規則,用三組括號分別圈出縣市、行政區、剩下的路段:

Google 試算表公式
fx

一次拆成縣市、行政區、路段三欄

=REGEXEXTRACT(A2, "^(.{2}[市縣])(.{1,3}?區|.{1,3}?[鄉鎮市])(.*)$")

規則裡有三組括號,REGEXEXTRACT 會把三組各放一欄,從 B2 往右溢出到 D2。來看看結果:

列B 縣市C 行政區D 路段
2台北市信義區松壽路 12 號 5 樓
3新北市板橋區文化路 3 段 8 號
4桃園市中壢區中正路 7 號
5新竹縣竹北市光明六路 21 號
6花蓮縣花蓮市中山路 9 號
7嘉義市東區中山路 15 號

.{1,3}? 結尾的問號讓它盡量少抓,不會一路吃到路名裡的字。行政區那一組寫成兩段:先找「一到三個字加區」,找不到才退而找「一到三個字加鄉、鎮、市」。這樣「臺南市新市區中山路 1 號」會正確拆成「新市區」,而不是在「新市」就停下來,把「區」留給路段。第 6 列的 B、C 欄都出現「花蓮」,因為縣名跟市名剛好同名,公式沒有出錯。

地址裡的「台」跟「臺」常常混著寫,要統一的話:

B2 的「台北市」會變成「臺北市」,其他列開頭不是「台」,原樣不動。

地址開頭有郵遞區號

從訂單系統或表單匯出的地址,前面常帶著郵遞區號,像「110 台北市信義區松壽路 12 號」或「11008台北市信義區松壽路 12 號」。這時上面拆縣市的公式會失敗,因為 ^ 要求縣市就在最前面。

只想要郵遞區號,就抓開頭的數字:

Google 試算表公式
fx

抓出地址開頭的郵遞區號

=REGEXEXTRACT(A2, "^\d{3,6}")

\d{3,6} 是連續三到六個數字,三碼、3+2 碼、3+3 碼的郵遞區號都抓得到。只要前三碼的話,改成 ^\d{3}。

要拆縣市,就先把郵遞區號和後面的空格拿掉,再把結果交給上面那條公式:

Google 試算表公式
fx

去掉開頭的郵遞區號

=REGEXREPLACE(A2, "^\d+\s*", "")

訂單單號

這次假設單號格式是 TW 加 8 碼日期、減號、4 碼流水號,例如 TW20261005-0042,放在 A2:A5:

A
1客服紀錄
2訂單 TW20261005-0042 已出貨
3補寄 TW20261007-0007,原單 TW20261001-0113 作廢
4tw20261008-0021 客人自己打的
5單號 TW2026-1009 打錯了

規則是 TW\d{8}-\d{4}。

Google 試算表公式
fx

抓出第一個單號

=IFERROR(REGEXEXTRACT(A2, "TW\d{8}-\d{4}"), "")

來看看 B2 到 B5 的結果:

列第一個單號
2TW20261005-0042
3TW20261007-0007
4(空白)
5(空白)

第 3 列有兩個單號,REGEXEXTRACT 只回傳第一個。想要最後一個的話,在規則前面加 .*,它會先盡量往後吃,再退回來抓最後一個符合的單號,並且用括號圈住單號:

Google 試算表公式
fx

抓出最後一個單號

=IFERROR(REGEXEXTRACT(A2, ".*(TW\d{8}-\d{4})"), "")

A3 會得到 TW20261001-0113。

第 4 列是客人自己打的小寫 tw,規則大小寫不同就比對不到。在規則最前面加 (?i) 可以忽略大小寫,抓出來再用 UPPER 轉成大寫:

Google 試算表公式
fx

忽略大小寫抓單號,並統一成大寫

=IFERROR(UPPER(REGEXEXTRACT(A4, "(?i)TW\d{8}-\d{4}")), "")

A4 會得到 TW20261008-0021。第 5 列的 TW2026-1009 格式本來就不對,留空白就好,這種列我會另外挑出來請同事確認。

一格裡有幾個單號也算得出來:把所有單號刪掉,看少了多少字元,再除以單號的長度 15。

Google 試算表公式
fx

算 A3 裡有幾個單號

=(LEN(A3) - LEN(REGEXREPLACE(A3, "TW\d{8}-\d{4}", ""))) / 15

A3 會得到 2。

Email 的網域

資料放在 A2:A5:

A
1聯絡方式
2請寄到 orders@example.com 謝謝
3orders@mail.example.com.tw
4聯絡 contact@example.tw 或 backup@example.org
5沒有填

我想看客人都用哪些網域。@ 後面接字母、數字、點、減號,最後是點加至少兩個字母,括號圈住 @ 後面的部分,這樣抓出來就不含 @:

Google 試算表公式
fx

抓出 Email 的網域

=IFERROR(REGEXEXTRACT(A2, "@([a-z0-9.-]+\.[a-z]{2,})"), "")

來看看 B2 到 B5 的結果:

列網域
2example.com
3mail.example.com.tw
4example.tw
5(空白)

第 4 列有兩個信箱,只抓第一個的網域。

只有信箱、沒有其他文字的欄位,可以用 REGEXMATCH 檢查格式。規則前後加 ^ 跟 $,表示整格都要符合:

Google 試算表公式
fx

檢查整格是不是 Email 格式

=REGEXMATCH(A2, "^[^@\s]+@[^@\s]+\.[a-z]{2,}$")

假設另一欄放這五個信箱,來看看結果:

信箱結果
orders@example.comTRUE
orders@exampleFALSE
orders @example.comFALSE
a@b.cFALSE
orders@example.com.twTRUE

[^@\s] 的意思是「不是 @ 也不是空白的字元」。這條規則只檢查長相,不保證信箱真的收得到信。

整欄一次處理

上面每條公式都是填一格再往下拉。資料常常會新增,我偏好用 ARRAYFORMULA 在標題列下面放一條公式,新增的列自動算出來。以手機為例:

Google 試算表公式
fx

整欄抓手機,沒有就留空

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A2:A6, "09\d{2}-\d{3}-\d{3}"), ""))

B2 到 B6 會得到 0912-345-678、0987-654-321、空白、0900-000-123、空白。範圍要抓到哪一列,要自己決定;寫成 A2:A 的話,空白列會被 IFERROR 擋下來變成空白。ARRAYFORMULA 的細節可以看 ARRAYFORMULA 實戰。

只是一次性整理、不需要之後自動更新的話,用「編輯」>「尋找並取代」勾選「使用規則運算式進行搜尋」會更快,操作寫在入門篇的最後一節。

四個任務下來,我最常卡住的地方都不在規則本身,而是資料裡混了全形字元、換行或數字格式。遇到「規則明明對、卻抓不到」的時候,可以翻 進階陷阱。

我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
#REGEX#正規表示式#資料提取#Email#電話#地址
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

這篇在技能樹的 Lv.4「進階應用」,模組「從混亂文字中提取資訊(進階)」(第 1/1 篇)。讀完這篇,路線上的下一個模組是「進階日期處理」。

回到技能樹

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。