Chapter 9. 函式 (四):字串處理9.4 正規表示式相關函式

9.4 正規表示式相關函式


正規表示式是電腦科學的一個概念。使用單個字串來描述符合一系列符合某個句法規則的字串,通常被用來檢索、替換那些符合某個模式的文字。 許多程式設計語言都支援利用正規表示式進行字串操作。而 Google Sheets 也有正規表示式相關的函式,提供找尋、取代、擷取內容之功能。常見正規表示式的規則如下 (改編自官方文件):

表示式

說明

例子

符合項目

不符合項目

.

任何一個字元。

d.g

d g、dog

dg、doog

*

前面字元重複 0 次以上。

do*g

dg、doog

dug

+

前面字元顯示 1 次以上。

do+g

dog、doog

dg

?

前面字元顯示 0~1 次。

do?g

dg、dog

doog

[abc]

是否為括號中的內容,括弧內的字元通常都有效,限一個字元。

d[iou]g

dog、dug

dag、deg

[a-z]

是否為括號內範圍的內容,一般範圍包括 a-z、A-Z 和 0-9,也可以將多個範圍合併,例如 [a-zA-Z0-9]、[a-zA-Z, &*]。

d[i-u]g

dog、dug

dag、deg

[^abc]

是否「不是」括號中的內容。

d[^iou]g

dag、deg

dog、dug

(aa|bb)

是否為括號中的內容,括弧內的字元通常都有效,用於多個字元時。

d(a|oo)g

dag、doog

dog

^

位於正規表示式的開始。

^[dh]og

dog toy

hot dog

$

位於正規表示式的結尾。

[dh]og$

hot dog

dog toy

{A, B}

前一個運算式重複 A 至 B 次,且 A 和 B 都是數字。

d(o{1, 3})g

dog、dooog

dg、doooog

\s

空格字元。

d\sg

d g

dg、d  g

\

跳脫字元,用於字元本身有表示式意義,但欲搜尋其字元形式者,例如 .+?()[] 等。

\(dog\)

(dog)

dog

(...)

用於要取得某段字串時,用括號表示要取得的部分。

d(.*)g

doog ⭢ oo


各表示式符合與不符合之項目如下圖所示:

了解正規表示式的規則後,接下來介紹三個使用正規表示式搜尋與取代的函式,如下:

語法

輸入

  • 文字:要搜尋的文字。
  • 規則運算式:正規表示式,要以文字形式呈現。
  • 取代:要取代的字串。

輸出

  • REGEXMATCH:TRUE / FALSE,文字 是否有符合 規則運算式 的內容。
  • REGEXEXTRACT:文字 中符合 規則運算式 的內容,若沒有符合的內容會輸出 #N/A!。
  • REGEXREPLACE:將 文字 中全部符合 規則運算式 的內容取代成 取代,若沒有符合的內容則會輸出原本 文字 的內容。

以下將繼續使用已命名範圍「ptt看板範例」搭配兩個基本範例及一個進階範例說明如何列式正規表示式並運用在公式中:

  1. 取得 ptt看板範例 ◎ 之後的內容 (包含 ◎)

    公式

    =REGEXEXTRACT(ptt看板範例,"◎.*")

    解說

    通常要取得所有內容會使用 ".*",在此因為只需要 ◎ 之後的內容,所以 規則運算式 為 "◎.*"

  2. 取得 ptt看板範例 [] 中的內容 (不包含 [])

    公式

    =REGEXEXTRACT(ptt看板範例,"\[(.*)\]")

    解說

    • 因為 [...] 在正規表示式的語法中有意義,所以前面要加上跳脫字元 \,即 "\[.*\]",會輸出「[棒球]」。
    • 因為輸出不要包含 [],所以要用小括號包住要取得的部分,即 "\[(.*)\]"
  3. 將 ptt看板範例 的人氣 (即 2607) 取代為 XXX

    公式

    • =REGEXREPLACE(ptt看板範例,"[0-9]+","XXX")
    • =REGEXREPLACE(ptt看板範例,"^(.*?)\s[0-9]+\s","$1 XXX ")

    解說

    • 第一種做法較簡單,直接將在此可使用 "[0-9]+" 找出所有的數字部分,並取代成 "XXX"
    • 第一種做法不能應用到其他看板上,例如「PC_Shopping 363 硬體 ◎[電蝦] intel 13 14代災情回報」,會將所有的數字都變成 XXX,因此要先找出所有要取代的文字的規律,可發現人氣一定會出現在第一個空格及第二個空格之間,因為前面的看板名稱絕對不會有空格。
    • 發現規律後,可將正規表示式調整成 "^.*?\s[0-9]+\s",說明如下:
      • ^.*?:開頭是任意字元。
      • \s:空格字元,人氣的前後都有空格。
    • 若使用 =REGEXREPLACE(ptt看板範例,"^.*?\s[0-9]+\s"," XXX "),會發現前面的看板名稱會消失,在此可使用 (...) 包住要保留的字串,並在 取代 中使用 $X (X 為數字,代表第幾個括號) 沿用原本的內容,因此 規則運算式 改為 "^(.*?)\s[0-9]+\s"取代 改為 "$1 XXX "

範例 C. 有些複雜,是為了在 Google Sheets 中針對字串做出更精確、細緻的判斷。而精通正規表示式的難度不低,在此僅希望透過範例讓大家瞭解此函式的用法,因此不再針對正規表示式進行更多介紹,有興趣的同學歡迎自行研究官方文件,或是詢問 ChatGPT 相關的做法。