跳到主要內容跳到頁尾

正規表示式入門:REGEXMATCH、REGEXEXTRACT、REGEXREPLACE 與基本符號

7 分鐘閱讀Lv.1 初學者摘要與日期

從 T-17 這種編號開始,學會 REGEXMATCH 判斷、REGEXEXTRACT 擷取、REGEXREPLACE 取代,以及 . \d \w [] + * ? {n} ^ $ () | 這些基本符號,最後用「尋找並取代」套用規則運算式。

發布 更新

文章目錄

今天要來聊聊正規表示式(Regular Expression,簡稱 regex),還有 Google 試算表裡跟它有關的三個函式:REGEXMATCH、REGEXEXTRACT、REGEXREPLACE。

簡單來說,正規表示式是一種描述「這串文字長什麼樣子」的寫法,三個函式分別拿它來判斷、擷取、取代。

手動拆編號有多麻煩

我手上有一份手搖飲的菜單,品名前面有編號,長度不太一致:

A
1菜單
2T-17 蘋果紅茶
3T-04 烏龍奶茶
4T-32 蘋果綠茶
5T-9 青茶
6T-25 桂花烏龍
7冬瓜檸檬

我想把編號抽出來。大部分編號都是 4 個字元,用 LEFT 取前 4 個字就好:

來看看 A2 到 A7 的結果:

列LEFT(A, 4) 的結果
2T-17
3T-04
4T-32
5T-9 (後面多一個空格)
6T-25
7冬瓜檸檬(這列根本沒有編號)

第 5 列的 T-9 只有 3 個字元,多抓到一個空格,第 7 列更是整個品名被當成編號。固定位置的做法一碰到長度不一,就要開始寫 FIND、IF 一層一層補。這時候就可以把 REGEXEXTRACT 派上場,只要告訴它「編號長這樣」就好。

REGEXMATCH

REGEXMATCH 判斷一段文字有沒有符合你描述的樣子,回傳 TRUE 或 FALSE。

語法

  • 文字:要檢查的文字,可以是儲存格。
  • 規則運算式:描述樣子的字串,要用半形雙引號框起來。

範例

我想知道每一列有沒有編號。編號是英文字母 T、一個減號、再接一個以上的數字,寫成規則運算式就是 T-\d+,其中 \d 代表一個數字,+ 代表「前面那個東西出現一次以上」。

在 B2 輸入 REGEXMATCH,把原始文字保留在 A 欄:

Google 試算表公式
fx

A2 有沒有 T- 加數字

=REGEXMATCH(A2, "T-\d+")

將 B2 的公式往下填滿 B2:B7,不要覆蓋 A2:A7 的原始文字。結果如下:

列文字結果
2T-17 蘋果紅茶TRUE
3T-04 烏龍奶茶TRUE
4T-32 蘋果綠茶TRUE
5T-9 青茶TRUE
6T-25 桂花烏龍TRUE
7冬瓜檸檬FALSE

要記得一件事,REGEXMATCH 只要文字裡「任何一段」符合就會是 TRUE,不需要整串都符合。想要整串都要符合,就在規則前面加 ^(開頭)、後面加 $(結尾),後面的符號表會再提到。

REGEXEXTRACT

REGEXEXTRACT 把文字裡符合規則的那一段抓出來。

語法

參數跟 REGEXMATCH 一樣。抓到的是第一個符合的片段,找不到的話回傳 #N/A。

範例

同樣的規則,換成抓編號:

Google 試算表公式
fx

抓出 A2 的編號

=REGEXEXTRACT(A2, "T-\d+")

來看看結果:

列文字結果
2T-17 蘋果紅茶T-17
3T-04 烏龍奶茶T-04
4T-32 蘋果綠茶T-32
5T-9 青茶T-9
6T-25 桂花烏龍T-25
7冬瓜檸檬#N/A

T-9 乾乾淨淨,沒有多出空格,因為規則描述的是「一個以上的數字」,字元數多寡都接得住。第 7 列沒有編號,所以是 #N/A。想讓它顯示空白的話,外面包一層 IFERROR(…, "") 就可以了。

REGEXREPLACE

REGEXREPLACE 把符合規則的部分換成別的文字,換成空字串就是刪掉。

語法

  • 取代為:用來替換的文字,要換成空白就寫 ""。
  • 文字裡所有符合的地方都會被換掉,不是只換第一個。
  • 完全沒有符合的話,回傳原本的文字,不會出錯。

範例

我想只留品名,把開頭的編號跟後面那個空格刪掉。^ 代表「從開頭算起」:

Google 試算表公式
fx

刪掉開頭的編號與空格

=REGEXREPLACE(A2, "^T-\d+ ", "")

來看看結果:

列文字結果
2T-17 蘋果紅茶蘋果紅茶
3T-04 烏龍奶茶烏龍奶茶
4T-32 蘋果綠茶蘋果綠茶
5T-9 青茶青茶
6T-25 桂花烏龍桂花烏龍
7冬瓜檸檬冬瓜檸檬

第 7 列沒有編號可刪,原樣回來。固定的文字用 SUBSTITUTE 比較直覺,像上面這種「長度不一、但樣子固定」的才輪到 REGEXREPLACE。

符號怎麼讀

規則運算式是由「一般字元」和「有特殊意思的符號」混在一起寫成的。一般字元就是照字面比對,蘋果 就是找「蘋果」兩個字。下面這張表拿 T-17 蘋果紅茶 當測試文字,用 REGEXEXTRACT 看每個符號抓到什麼:

符號意思範例規則抓到
.任何一個字元T.1T-1
\d一個數字 0 到 9\d\d17
\w一個英文字母、數字或底線\w+T
[ ]括號內任選一個字元[A-Z]-[0-9]T-1
+前面那個出現一次以上\d+17
*前面那個出現零次以上T\d*-T-
?前面那個出現零或一次T-?1T-1
{n}前面那個剛好出現 n 次\d{2}17

\w+ 只抓到 T,因為減號不算在 \w 裡面。T\d*- 抓到的 T-,是 \d* 出現了零次的情況。

接著是位置、群組和「或」:

符號意思範例規則抓到
^文字的開頭^TT
$文字的結尾茶$茶
( )把一段包成一組,只抓括號內的T-(\d+)17

( ) 還有更多眉角,包括括號有兩組以上時回傳什麼,留到 進階陷阱 那篇再講。

最後一個是 |,意思是「或」。我想知道哪些品名有「蘋果」或「烏龍」:

Google 試算表公式
fx

蘋果或烏龍,有一個就算

=REGEXMATCH(A2, "蘋果|烏龍")

來看看 A2 到 A7 的結果:

列文字結果
2T-17 蘋果紅茶TRUE
3T-04 烏龍奶茶TRUE
4T-32 蘋果綠茶TRUE
5T-9 青茶FALSE
6T-25 桂花烏龍TRUE
7冬瓜檸檬FALSE

數量符號可以疊著用。^T-\d{2} 的意思是「開頭是 T-,接著剛好兩個數字,再一個空格」,所以兩位數的 T-17 符合,一位數的 T-9 就不符合:

Google 試算表公式
fx

編號剛好是兩位數

=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 則支援。

在「尋找並取代」用規則運算式

不想寫公式、只想一次性改掉資料的話,可以用「編輯」>「尋找並取代」,它也吃規則運算式:

  1. 點「編輯」>「尋找並取代」(Windows 與 Mac 在 Chrome 上的快捷鍵分別是 Ctrl+H 與 Cmd+Shift+H)。

步驟 1:編輯 > 尋找並取代

  1. 在「尋找」欄輸入規則,例如 ^T-\d+ ;「取代為」留空;勾選「使用規則運算式進行搜尋」。勾了之後,「大小寫需相符」會自動跟著勾起來。

步驟 2:勾選使用規則運算式進行搜尋

  1. 按「全部取代」。

這個做法會直接改掉儲存格的內容,而且按下去之後只能用 Ctrl+Z(Mac 為 Cmd+Z)倒回去,所以我通常會先複製一份工作表再動手。要保留原始資料、或之後新增的資料也要自動處理的話,還是用 REGEXREPLACE 公式。

1

蘋果系列且兩位數編號

用 REGEXMATCH 判斷 A2 這種菜單文字,是否「開頭是兩位數編號(T-xx),而且品名以蘋果開頭」。A2 到 A7 應該得到 TRUE、FALSE、TRUE、FALSE、FALSE、FALSE。

三個函式的差別只在最後拿規則做什麼:判斷、抓出來、換掉。規則本身學會一次,三個都能用。接下來可以看 電話、地址、單號、Email 的實戰整理,等到遇到「為什麼這條在別的地方能跑、Sheets 卻報錯」的時候,再翻 進階陷阱。

分享:
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

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

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

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

免費,隨時可取消。

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