今天要來聊聊正規表示式(Regular Expression,簡稱 regex),還有 Google 試算表裡跟它有關的三個函式:REGEXMATCH、REGEXEXTRACT、REGEXREPLACE。
簡單來說,正規表示式是一種描述「這串文字長什麼樣子」的寫法,三個函式分別拿它來判斷、擷取、取代。
手動拆編號有多麻煩
我手上有一份手搖飲的菜單,品名前面有編號,長度不太一致:
| A | |
|---|---|
| 1 | 菜單 |
| 2 | T-17 蘋果紅茶 |
| 3 | T-04 烏龍奶茶 |
| 4 | T-32 蘋果綠茶 |
| 5 | T-9 青茶 |
| 6 | T-25 桂花烏龍 |
| 7 | 冬瓜檸檬 |
我想把編號抽出來。大部分編號都是 4 個字元,用 LEFT 取前 4 個字就好:
來看看 A2 到 A7 的結果:
| 列 | LEFT(A, 4) 的結果 |
|---|---|
| 2 | T-17 |
| 3 | T-04 |
| 4 | T-32 |
| 5 | T-9 (後面多一個空格) |
| 6 | T-25 |
| 7 | 冬瓜檸檬(這列根本沒有編號) |
第 5 列的 T-9 只有 3 個字元,多抓到一個空格,第 7 列更是整個品名被當成編號。固定位置的做法一碰到長度不一,就要開始寫 FIND、IF 一層一層補。這時候就可以把 REGEXEXTRACT 派上場,只要告訴它「編號長這樣」就好。
REGEXMATCH
REGEXMATCH 判斷一段文字有沒有符合你描述的樣子,回傳 TRUE 或 FALSE。
語法
- 文字:要檢查的文字,可以是儲存格。
- 規則運算式:描述樣子的字串,要用半形雙引號框起來。
範例
我想知道每一列有沒有編號。編號是英文字母 T、一個減號、再接一個以上的數字,寫成規則運算式就是 T-\d+,其中 \d 代表一個數字,+ 代表「前面那個東西出現一次以上」。
在 B2 輸入 REGEXMATCH,把原始文字保留在 A 欄:
A2 有沒有 T- 加數字
=REGEXMATCH(A2, "T-\d+")將 B2 的公式往下填滿 B2:B7,不要覆蓋 A2:A7 的原始文字。結果如下:
| 列 | 文字 | 結果 |
|---|---|---|
| 2 | T-17 蘋果紅茶 | TRUE |
| 3 | T-04 烏龍奶茶 | TRUE |
| 4 | T-32 蘋果綠茶 | TRUE |
| 5 | T-9 青茶 | TRUE |
| 6 | T-25 桂花烏龍 | TRUE |
| 7 | 冬瓜檸檬 | FALSE |
要記得一件事,REGEXMATCH 只要文字裡「任何一段」符合就會是 TRUE,不需要整串都符合。想要整串都要符合,就在規則前面加 ^(開頭)、後面加 $(結尾),後面的符號表會再提到。
REGEXEXTRACT
REGEXEXTRACT 把文字裡符合規則的那一段抓出來。
語法
參數跟 REGEXMATCH 一樣。抓到的是第一個符合的片段,找不到的話回傳 #N/A。
範例
同樣的規則,換成抓編號:
抓出 A2 的編號
=REGEXEXTRACT(A2, "T-\d+")來看看結果:
| 列 | 文字 | 結果 |
|---|---|---|
| 2 | T-17 蘋果紅茶 | T-17 |
| 3 | T-04 烏龍奶茶 | T-04 |
| 4 | T-32 蘋果綠茶 | T-32 |
| 5 | T-9 青茶 | T-9 |
| 6 | T-25 桂花烏龍 | T-25 |
| 7 | 冬瓜檸檬 | #N/A |
T-9 乾乾淨淨,沒有多出空格,因為規則描述的是「一個以上的數字」,字元數多寡都接得住。第 7 列沒有編號,所以是 #N/A。想讓它顯示空白的話,外面包一層 IFERROR(…, "") 就可以了。
REGEXREPLACE
REGEXREPLACE 把符合規則的部分換成別的文字,換成空字串就是刪掉。
語法
- 取代為:用來替換的文字,要換成空白就寫
""。 - 文字裡所有符合的地方都會被換掉,不是只換第一個。
- 完全沒有符合的話,回傳原本的文字,不會出錯。
範例
我想只留品名,把開頭的編號跟後面那個空格刪掉。^ 代表「從開頭算起」:
刪掉開頭的編號與空格
=REGEXREPLACE(A2, "^T-\d+ ", "")來看看結果:
| 列 | 文字 | 結果 |
|---|---|---|
| 2 | T-17 蘋果紅茶 | 蘋果紅茶 |
| 3 | T-04 烏龍奶茶 | 烏龍奶茶 |
| 4 | T-32 蘋果綠茶 | 蘋果綠茶 |
| 5 | T-9 青茶 | 青茶 |
| 6 | T-25 桂花烏龍 | 桂花烏龍 |
| 7 | 冬瓜檸檬 | 冬瓜檸檬 |
第 7 列沒有編號可刪,原樣回來。固定的文字用 SUBSTITUTE 比較直覺,像上面這種「長度不一、但樣子固定」的才輪到 REGEXREPLACE。
符號怎麼讀
規則運算式是由「一般字元」和「有特殊意思的符號」混在一起寫成的。一般字元就是照字面比對,蘋果 就是找「蘋果」兩個字。下面這張表拿 T-17 蘋果紅茶 當測試文字,用 REGEXEXTRACT 看每個符號抓到什麼:
| 符號 | 意思 | 範例規則 | 抓到 |
|---|---|---|---|
. | 任何一個字元 | T.1 | T-1 |
\d | 一個數字 0 到 9 | \d\d | 17 |
\w | 一個英文字母、數字或底線 | \w+ | T |
[ ] | 括號內任選一個字元 | [A-Z]-[0-9] | T-1 |
+ | 前面那個出現一次以上 | \d+ | 17 |
* | 前面那個出現零次以上 | T\d*- | T- |
? | 前面那個出現零或一次 | T-?1 | T-1 |
{n} | 前面那個剛好出現 n 次 | \d{2} | 17 |
\w+ 只抓到 T,因為減號不算在 \w 裡面。T\d*- 抓到的 T-,是 \d* 出現了零次的情況。
接著是位置、群組和「或」:
| 符號 | 意思 | 範例規則 | 抓到 |
|---|---|---|---|
^ | 文字的開頭 | ^T | T |
$ | 文字的結尾 | 茶$ | 茶 |
( ) | 把一段包成一組,只抓括號內的 | T-(\d+) | 17 |
( ) 還有更多眉角,包括括號有兩組以上時回傳什麼,留到 進階陷阱 那篇再講。
最後一個是 |,意思是「或」。我想知道哪些品名有「蘋果」或「烏龍」:
蘋果或烏龍,有一個就算
=REGEXMATCH(A2, "蘋果|烏龍")來看看 A2 到 A7 的結果:
| 列 | 文字 | 結果 |
|---|---|---|
| 2 | T-17 蘋果紅茶 | TRUE |
| 3 | T-04 烏龍奶茶 | TRUE |
| 4 | T-32 蘋果綠茶 | TRUE |
| 5 | T-9 青茶 | FALSE |
| 6 | T-25 桂花烏龍 | TRUE |
| 7 | 冬瓜檸檬 | FALSE |
數量符號可以疊著用。^T-\d{2} 的意思是「開頭是 T-,接著剛好兩個數字,再一個空格」,所以兩位數的 T-17 符合,一位數的 T-9 就不符合:
編號剛好是兩位數
=REGEXMATCH(A2, "^T-\d{2} ")來看看結果:A2 到 A7 依序是 TRUE、TRUE、TRUE、FALSE、TRUE、FALSE。
如果想比對符號本身,例如真的要找一個句點或問號,前面加反斜線 \ 跳脫,像 \.、\?。
順帶一提 Excel 的對照:Microsoft 365 也有 REGEXTEST(對應 REGEXMATCH)、REGEXEXTRACT、REGEXREPLACE,不過只有 365 才有,採用 PCRE2 語法;Sheets 用的是 RE2,不支援 lookaround 與反向參照,PCRE2 則支援。
在「尋找並取代」用規則運算式
不想寫公式、只想一次性改掉資料的話,可以用「編輯」>「尋找並取代」,它也吃規則運算式:
- 點「編輯」>「尋找並取代」(Windows 與 Mac 在 Chrome 上的快捷鍵分別是 Ctrl+H 與 Cmd+Shift+H)。
- 在「尋找」欄輸入規則,例如
^T-\d+;「取代為」留空;勾選「使用規則運算式進行搜尋」。勾了之後,「大小寫需相符」會自動跟著勾起來。
- 按「全部取代」。
這個做法會直接改掉儲存格的內容,而且按下去之後只能用 Ctrl+Z(Mac 為 Cmd+Z)倒回去,所以我通常會先複製一份工作表再動手。要保留原始資料、或之後新增的資料也要自動處理的話,還是用 REGEXREPLACE 公式。
蘋果系列且兩位數編號
用 REGEXMATCH 判斷 A2 這種菜單文字,是否「開頭是兩位數編號(T-xx),而且品名以蘋果開頭」。A2 到 A7 應該得到 TRUE、FALSE、TRUE、FALSE、FALSE、FALSE。
三個函式的差別只在最後拿規則做什麼:判斷、抓出來、換掉。規則本身學會一次,三個都能用。接下來可以看 電話、地址、單號、Email 的實戰整理,等到遇到「為什麼這條在別的地方能跑、Sheets 卻報錯」的時候,再翻 進階陷阱。
接下來可以
相關文章
查看所有文章電話、地址、單號、Email:四種混亂文字的 REGEX 實戰整理
拿一份客服回饋的混亂文字,用 REGEXEXTRACT、REGEXMATCH、REGEXREPLACE 擷取台灣手機與市話、拆出縣市與行政區、抓訂單單號、取出 Email 網域,最後用 ARRAYFORMULA 處理整欄。
文字清理函式參考:TRIM、CLEAN、SUBSTITUTE、PROPER 與看不見的空格
整理 TRIM、CLEAN、SUBSTITUTE、REPLACE、UPPER、LOWER、PROPER 的語法與限制,包含 TRIM 清不掉全形空格與 CHAR(160)、CLEAN 只清 ASCII 0 到 31、SUBSTITUTE 第 4 參數只換第 N 次,以及用 UNICODE 找出看不見的字元。
留言討論
共 0 則留言


