跳到主要內容跳到頁尾

REGEX 函式踩坑整理:RE2 不支援的語法、多群組回傳、中文與全形字元

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

整理 Google 試算表 REGEXMATCH、REGEXEXTRACT、REGEXREPLACE 常見的怪現象:lookahead 與反向參照報錯、括號多回傳多欄、找不到回 #N/A、數字要先轉文字、\w 不含中文、全形字元、$1 寫法,以及雙引號與反斜線的跳脫。

發布 更新

文章目錄

網路上抄來的規則運算式貼進 REGEXEXTRACT,結果回一個錯誤;或是規則明明對,遇到中文就抓不到。多半是 Google 試算表用的規則運算式引擎,跟你抄的來源不是同一套。

如果你用的是 Microsoft 365,它也有 REGEXTEST、REGEXEXTRACT、REGEXREPLACE(僅 365 提供),但用的是 PCRE2 引擎,跟 Google 試算表的 RE2 不同,同一條規則不能直接搬過來用。

基本語法和三個函式的用法在 正規表示式入門,實際整理電話、地址的例子在 四種混亂文字的實戰整理。這篇直接從會出事的地方開始。

lookahead、lookbehind、反向參照不能用

Google 試算表的規則運算式是 RE2 引擎。RE2 為了保證執行速度,刻意不支援三種寫法:

  • lookahead:(?=…)、(?!…),「後面要接什麼」。
  • lookbehind:(?<=…)、(?<!…),「前面要有什麼」。
  • 反向參照:\1、\2,在規則裡引用前面括號抓到的內容。

我手上有三格資料,A2 是 蘋果紅茶 45 元,A3 是 青茶 35 元,A4 是 T-1177。

我想抓「蘋果紅茶」後面的價格,從別的語言學來的寫法是 lookbehind:

這條會回 #REF!,同樣的 lookahead 、反向參照 也是。

修法是換個想法,把「前面要有什麼」直接寫進規則,再用括號只抓你要的部分:

Google 試算表公式
fx

用群組取代 lookbehind

=REGEXEXTRACT(A2, "蘋果紅茶 (\d+)")

來看看結果:45。

lookahead 的用途多半是「確認後面有某字」,直接寫在規則裡就好,像 蘋果紅茶 取代 蘋果(?=紅茶),要只拿前半的話就用 (蘋果)紅茶,會得到「蘋果」。

反向參照最常拿來找「連續重複的數字」。沒有替代語法,只好把可能的組合列出來:

Google 試算表公式
fx

用 | 列出所有重複數字取代 \1

=REGEXMATCH(A4, "00|11|22|33|44|55|66|77|88|99")

A4 的 T-1177 含有 11,所以是 TRUE。

1

找出錯在哪

同事在 B2 寫了 ,想抓出編號的數字 17,結果出現錯誤。請改成可以得到 17 的寫法。

REGEXEXTRACT 回傳幾欄,看括號有幾組

REGEXEXTRACT 的回傳內容跟規則裡有幾組「擷取群組」(用 ( ) 圈起來的部分)有關:

規則裡的括號回傳
沒有整段符合的文字
一組那一組的內容
多組每一組各占一欄,往右溢出

拿 A2 是 2026-10-11 14:30 的情況來看:

規則結果
\d{4}-\d{2}-\d{2}2026-10-11
(\d{4})-\d{2}-\d{2}2026
(\d{4})-(\d{2})-(\d{2})2026、10、11(占三欄)

最容易踩到的是「括號只拿來表示『或』」,卻意外多出一欄。A2 是 蘋果紅茶 45 元,A3 是 青茶 35 元,我想不管哪一種都抓價格:

這條會回兩欄:蘋果紅、45,A3 則是 青、35。價格被擠到第二欄,往下拉很容易被後面的欄位蓋掉。括號前面加 ?:,變成「非擷取群組」,只分組、不回傳:

Google 試算表公式
fx

非擷取群組:括號只用來分組

=REGEXEXTRACT(A2, "(?:蘋果紅|青)茶 (\d+)")

A2 得到 45,A3 得到 35,各一欄。

另一個常見狀況是整段都沒有符合。拿 冬瓜檸檬 去抓數字:

結果是 #N/A,不會出現空白或 0。可以包 IFERROR,但 IFERROR 會連規則寫錯、參數寫錯的錯誤一起吃掉。我個人偏好先用 REGEXMATCH 擋一層,這樣規則本身出錯時還看得到錯誤:

Google 試算表公式
fx

先判斷有沒有,再擷取

=IF(REGEXMATCH(A5, "\d+"), REGEXEXTRACT(A5, "\d+"), "")

A5 是 冬瓜檸檬 的時候,結果是空白。

這三個函式只吃文字

假設 A2 放的是數字 11051(五碼郵遞區號的示意值,當成數字輸入):

儲存格內容是數字,函式要的是文字,這條會回 #VALUE!。日期也是數字,所以對日期儲存格直接用 REGEXEXTRACT 一樣會錯。

修法有兩種,擇一:

  • TO_TEXT(A2):把值轉成文字,。
  • A2&"":接上一個空字串,。

兩條都得到 TRUE。我自己比較常用 &"",打字比較短。

日期要先用 TEXT 轉成你要的格式。假設 A3 是日期 2026/10/11:

Google 試算表公式
fx

日期先轉成文字再擷取年份

=REGEXEXTRACT(TEXT(A3, "yyyy-mm-dd"), "\d{4}")

結果是 2026。

擷取結果是文字,開頭的 0 會保留

REGEXEXTRACT 回傳文字,即使擷取內容全部都是數字也一樣;這也符合 Google 官方說明。

結果是文字 04,ISTEXT 是 TRUE,ISNUMBER 是 FALSE。電話號碼也會保留開頭的 0:

結果是文字 0912345678,不需要再用 TEXT 補 0。真的要拿擷取結果做數值運算時,再明確轉型:

Google 試算表公式
fx

需要數值時才用 VALUE 轉型

=VALUE(REGEXEXTRACT("T-04", "T-(\d+)"))

這時才會得到數值 4。電話、郵遞區號、編號通常要保留文字,不要為了顯示而轉成數值;乘以 1 或其他數值運算也可能讓開頭的 0 消失。

\w 不含中文,\d 不吃全形數字

RE2 的 \w 只認 ASCII 的英文字母、數字、底線,\d 只認半形 0 到 9,\s 也不包含全形空格。

想做的事容易寫錯預期結果
文字裡有沒有字元REGEXMATCH("蘋果紅茶", "\w")FALSE
刪掉符號REGEXREPLACE("T-17 蘋果紅茶", "\W", "")T17
全形數字REGEXMATCH("T-17", "\d")FALSE
全形空格REGEXREPLACE("蘋果 紅茶", "\s", "")蘋果 紅茶(沒變)

第二列的 \W 是「不是 \w 的字元」,會連中文一起刪掉。「清掉標點符號」這類需求,直接用 [^\w\s] 會誤傷中文,整欄中文都會被清光。

Google 試算表雖然使用 RE2,卻不支援 Unicode 字元類別比對(官方說明也是這樣寫);不能直接套用 \p{Han} 或 \p{Nd},這兩種規則都會報錯,提示是無效的規則運算式。

這個例子只需要刪掉減號和全形逗號,直接列出要刪的符號,避免用中文字白名單誤刪罕見字:

Google 試算表公式
fx

只刪明確列出的減號與逗號

=REGEXREPLACE("T-17 蘋果紅茶,限量", "[-,]", "")

來看看結果:T17 蘋果紅茶限量。其他未列出的符號會保留;遇到新符號時,再依需求加入規則。

全形數字則把半形跟全形範圍都列出來:

Google 試算表公式
fx

同時接受半形與全形數字

=REGEXMATCH("T-17", "[0-90-9]")

結果是 TRUE。[0-90-9] 只接受這兩組數字;其他文字系統的數字需要另外列出範圍。

全形空格(U+3000)要自己放進括號:

Google 試算表公式
fx

同時刪除半形與全形空白

=REGEXREPLACE("蘋果 紅茶", "[\s ]", "")

結果是 蘋果紅茶。

電話的減號也是常見的全形陷阱。從 PDF 或通訊軟體複製來的 0912-345-678,中間是全形減號:

結果是 FALSE。把減號改成 [--],兩種都接受:

Google 試算表公式
fx

接受半形與全形減號

=REGEXMATCH("0912-345-678", "09\d{2}[--]\d{3}[--]\d{3}")

結果是 TRUE。

REGEXREPLACE 的 $1

REGEXREPLACE 的「取代為」用 $1、$2 引用規則裡第 1 組、第 2 組括號抓到的內容,調換順序時很好用。把 2026-10-11 改成日.月.年:

Google 試算表公式
fx

用 $1 $2 $3 重新排列

=REGEXREPLACE("2026-10-11", "(\d{4})-(\d{2})-(\d{2})", "$3.$2.$1")

結果是 11.10.2026。其他語言常見的 \1 寫法,在 Sheets 請一律改成 $1。

$ 在「取代為」裡有特殊意思,真的想輸出美元符號,前面要加反斜線。把 45 換成 $45:

Google 試算表公式
fx

取代為裡的 $ 要跳脫

=REGEXREPLACE("45", "(\d+)", "\$$1")

結果是 $45。前面的 \$ 是一個真的 $,後面的 $1 才是群組。

雙引號、反斜線與換行

Sheets 公式的字串用雙引號框起來,裡面要放一個雙引號就寫兩個。規則是要找被引號框起來的內容,A2 的文字是 客人說 "少冰" 謝謝:

Google 試算表公式
fx

規則裡的雙引號要寫兩次

=REGEXEXTRACT(A2, """(.+)""")

最外面的一對是字串的引號,中間 "" 是規則裡的一個 ",所以這條的規則其實是 "(.+)"。結果是 少冰。

從 Word 或 Docs 複製來的內容常是彎引號 “少冰”,跟直引號是不同的字元,上面那條抓不到,回 #N/A。A3 是 客人說 “少冰” 謝謝 的話,兩種都放進括號:

Google 試算表公式
fx

同時接受直引號與彎引號

=REGEXEXTRACT(A3, "[""“”](.+)[""“”]")

結果是 少冰。

反斜線在 Sheets 的字串裡不是跳脫字元,所以 \d、\. 直接寫就行。想比對一個真的反斜線,規則要寫兩個 \\。A4 是檔案路徑 C:\報表\10月.xlsx,我想取最後的檔名:

Google 試算表公式
fx

取反斜線後面的檔名

=REGEXEXTRACT(A4, "[^\\]+$")

結果是 10月.xlsx。寫成 [^\]+$ 的話,\] 被當成跳脫的右括號,括號沒有關起來。規則寫錯、字元類別沒有閉合時會回 #REF!(ERROR.TYPE 為 4),與前面的不支援規則一致。

最後是換行。規則裡的 . 不包含換行字元,儲存格裡有多行文字時會只抓到第一行。A5 的內容是兩行,第一行 備註:蘋果,第二行 少冰:

結果只有 蘋果。規則最前面加 (?s),. 就會連換行一起吃:

Google 試算表公式
fx

(?s) 讓 . 包含換行

=REGEXEXTRACT(A5, "(?s)備註:(.*)")

結果是兩行都抓到,儲存格裡顯示成「蘋果」換行「少冰」。

以上的規則,在「編輯」>「尋找並取代」勾選「使用規則運算式進行搜尋」時,官方說明同樣使用 RE2,所以 lookahead 一樣不能用。貼進去之前先在公式裡試過,比直接全部取代安全。

分享:
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

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

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

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

免費,隨時可取消。

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