網路上抄來的規則運算式貼進 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 、反向參照 也是。
修法是換個想法,把「前面要有什麼」直接寫進規則,再用括號只抓你要的部分:
用群組取代 lookbehind
=REGEXEXTRACT(A2, "蘋果紅茶 (\d+)")來看看結果:45。
lookahead 的用途多半是「確認後面有某字」,直接寫在規則裡就好,像 蘋果紅茶 取代 蘋果(?=紅茶),要只拿前半的話就用 (蘋果)紅茶,會得到「蘋果」。
反向參照最常拿來找「連續重複的數字」。沒有替代語法,只好把可能的組合列出來:
用 | 列出所有重複數字取代 \1
=REGEXMATCH(A4, "00|11|22|33|44|55|66|77|88|99")A4 的 T-1177 含有 11,所以是 TRUE。
找出錯在哪
同事在 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。價格被擠到第二欄,往下拉很容易被後面的欄位蓋掉。括號前面加 ?:,變成「非擷取群組」,只分組、不回傳:
非擷取群組:括號只用來分組
=REGEXEXTRACT(A2, "(?:蘋果紅|青)茶 (\d+)")A2 得到 45,A3 得到 35,各一欄。
另一個常見狀況是整段都沒有符合。拿 冬瓜檸檬 去抓數字:
結果是 #N/A,不會出現空白或 0。可以包 IFERROR,但 IFERROR 會連規則寫錯、參數寫錯的錯誤一起吃掉。我個人偏好先用 REGEXMATCH 擋一層,這樣規則本身出錯時還看得到錯誤:
先判斷有沒有,再擷取
=IF(REGEXMATCH(A5, "\d+"), REGEXEXTRACT(A5, "\d+"), "")A5 是 冬瓜檸檬 的時候,結果是空白。
這三個函式只吃文字
假設 A2 放的是數字 11051(五碼郵遞區號的示意值,當成數字輸入):
儲存格內容是數字,函式要的是文字,這條會回 #VALUE!。日期也是數字,所以對日期儲存格直接用 REGEXEXTRACT 一樣會錯。
修法有兩種,擇一:
TO_TEXT(A2):把值轉成文字,。A2&"":接上一個空字串,。
兩條都得到 TRUE。我自己比較常用 &"",打字比較短。
日期要先用 TEXT 轉成你要的格式。假設 A3 是日期 2026/10/11:
日期先轉成文字再擷取年份
=REGEXEXTRACT(TEXT(A3, "yyyy-mm-dd"), "\d{4}")結果是 2026。
擷取結果是文字,開頭的 0 會保留
REGEXEXTRACT 回傳文字,即使擷取內容全部都是數字也一樣;這也符合 Google 官方說明。
結果是文字 04,ISTEXT 是 TRUE,ISNUMBER 是 FALSE。電話號碼也會保留開頭的 0:
結果是文字 0912345678,不需要再用 TEXT 補 0。真的要拿擷取結果做數值運算時,再明確轉型:
需要數值時才用 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},這兩種規則都會報錯,提示是無效的規則運算式。
這個例子只需要刪掉減號和全形逗號,直接列出要刪的符號,避免用中文字白名單誤刪罕見字:
只刪明確列出的減號與逗號
=REGEXREPLACE("T-17 蘋果紅茶,限量", "[-,]", "")來看看結果:T17 蘋果紅茶限量。其他未列出的符號會保留;遇到新符號時,再依需求加入規則。
全形數字則把半形跟全形範圍都列出來:
同時接受半形與全形數字
=REGEXMATCH("T-17", "[0-90-9]")結果是 TRUE。[0-90-9] 只接受這兩組數字;其他文字系統的數字需要另外列出範圍。
全形空格(U+3000)要自己放進括號:
同時刪除半形與全形空白
=REGEXREPLACE("蘋果 紅茶", "[\s ]", "")結果是 蘋果紅茶。
電話的減號也是常見的全形陷阱。從 PDF 或通訊軟體複製來的 0912-345-678,中間是全形減號:
結果是 FALSE。把減號改成 [--],兩種都接受:
接受半形與全形減號
=REGEXMATCH("0912-345-678", "09\d{2}[--]\d{3}[--]\d{3}")結果是 TRUE。
REGEXREPLACE 的 $1
REGEXREPLACE 的「取代為」用 $1、$2 引用規則裡第 1 組、第 2 組括號抓到的內容,調換順序時很好用。把 2026-10-11 改成日.月.年:
用 $1 $2 $3 重新排列
=REGEXREPLACE("2026-10-11", "(\d{4})-(\d{2})-(\d{2})", "$3.$2.$1")結果是 11.10.2026。其他語言常見的 \1 寫法,在 Sheets 請一律改成 $1。
$ 在「取代為」裡有特殊意思,真的想輸出美元符號,前面要加反斜線。把 45 換成 $45:
取代為裡的 $ 要跳脫
=REGEXREPLACE("45", "(\d+)", "\$$1")結果是 $45。前面的 \$ 是一個真的 $,後面的 $1 才是群組。
雙引號、反斜線與換行
Sheets 公式的字串用雙引號框起來,裡面要放一個雙引號就寫兩個。規則是要找被引號框起來的內容,A2 的文字是 客人說 "少冰" 謝謝:
規則裡的雙引號要寫兩次
=REGEXEXTRACT(A2, """(.+)""")最外面的一對是字串的引號,中間 "" 是規則裡的一個 ",所以這條的規則其實是 "(.+)"。結果是 少冰。
從 Word 或 Docs 複製來的內容常是彎引號 “少冰”,跟直引號是不同的字元,上面那條抓不到,回 #N/A。A3 是 客人說 “少冰” 謝謝 的話,兩種都放進括號:
同時接受直引號與彎引號
=REGEXEXTRACT(A3, "[""“”](.+)[""“”]")結果是 少冰。
反斜線在 Sheets 的字串裡不是跳脫字元,所以 \d、\. 直接寫就行。想比對一個真的反斜線,規則要寫兩個 \\。A4 是檔案路徑 C:\報表\10月.xlsx,我想取最後的檔名:
取反斜線後面的檔名
=REGEXEXTRACT(A4, "[^\\]+$")結果是 10月.xlsx。寫成 [^\]+$ 的話,\] 被當成跳脫的右括號,括號沒有關起來。規則寫錯、字元類別沒有閉合時會回 #REF!(ERROR.TYPE 為 4),與前面的不支援規則一致。
最後是換行。規則裡的 . 不包含換行字元,儲存格裡有多行文字時會只抓到第一行。A5 的內容是兩行,第一行 備註:蘋果,第二行 少冰:
結果只有 蘋果。規則最前面加 (?s),. 就會連換行一起吃:
(?s) 讓 . 包含換行
=REGEXEXTRACT(A5, "(?s)備註:(.*)")結果是兩行都抓到,儲存格裡顯示成「蘋果」換行「少冰」。
以上的規則,在「編輯」>「尋找並取代」勾選「使用規則運算式進行搜尋」時,官方說明同樣使用 RE2,所以 lookahead 一樣不能用。貼進去之前先在公式裡試過,比直接全部取代安全。
接下來可以
相關文章
查看所有文章電話、地址、單號、Email:四種混亂文字的 REGEX 實戰整理
拿一份客服回饋的混亂文字,用 REGEXEXTRACT、REGEXMATCH、REGEXREPLACE 擷取台灣手機與市話、拆出縣市與行政區、抓訂單單號、取出 Email 網域,最後用 ARRAYFORMULA 處理整欄。
公式出錯怎麼查:錯誤碼怎麼看,再一步步縮小範圍
公式出現 #N/A、#REF!、#VALUE!、#NUM! 時怎麼讀錯誤碼與滑鼠提示,用 FILTER、XLOOKUP、INDEX、SUMIFS 重現幾個常見的錯,再用彩色框、FORMULATEXT、ISNUMBER 等工具一步步找出原因。
留言討論
共 0 則留言
