漂浮著 \d、\d+、\d{4}、^、$ 等正規表示式符號的示意圖

上一篇「系列【正規表示式】──一次找出不同日期」組出了這個正規表示式:

\d{4}年\d{1,2}月\d{1,2}日

它可以一次找出像下面這些日期:

範例
2026年9月1日
2025年12月31日
1999年1月10日

這次我們再往前一步。

假設想把:

2026年9月1日

改成:

9/1/2026

這次不是把整個日期換成固定文字,而是要保留原本搜尋到的年、月、日,只改變它們的排列方式。

這時就會用到擷取群組。

把之後還要用的部分用括號括起來

上一篇的搜尋式是:

\d{4}年\d{1,2}月\d{1,2}日

之後還要再利用的部分有三個:

  • 年前面的 4 位數字
  • 月前面的 1~2 位數字
  • 日前面的 1~2 位數字

因此,把這三個部分分別用括號括起來:

(\d{4})年(\d{1,2})月(\d{1,2})日

和上一篇相比,只是多了三組括號。

像 (\d{4}) 這樣,把正規表示式的一部分放進括號裡,就能把這一段實際搜尋到的文字保留下來,稍後再使用。

以 2026年9月1日 為例:

  • (\d{4}) 找到的是 2026
  • 第一個 (\d{1,2}) 找到的是 9
  • 第二個 (\d{1,2}) 找到的是 1

可以把它想像成把搜尋結果暫時放進三個有編號的盒子裡。

用括號擷取的三個部分存成 $1、$2、$3,再於取代時重新排列的示意圖

圖1 括號括起來的部分會存成 $1、$2、$3,取代時再依需要的順序放回去

群組裡面放的是什麼2026年9月1日 的情況
$1年前面的 4 位數字2026
$2月前面的 1~2 位數字9
$3日前面的 1~2 位數字1

群組會按照括號從左到右的順序編號。

這種用括號保留下來的部分,在正規表示式裡稱為擷取群組。

名字聽起來有點技術味,但一開始只要記住:

把之後還要用的內容放進有編號的盒子裡。

這樣就足夠了。

用 $1、$2、$3 把盒子裡的內容取出來

現在:

  • 年在 $1
  • 月在 $2
  • 日在 $3

如果要把它改成月/日/年的順序,取代字串可以寫成:

$2/$3/$1

也就是:

  • $2 → 9
  • $3 → 1
  • $1 → 2026

最後得到:

9/1/2026

這裡沒有重新計算任何數字,只是把剛才存進盒子裡的三段文字,依照新的順序拿出來而已。

補充:擷取群組的寫法會依工具而不同

本文依照 memoQ 使用的格式,以 $1、$2、$3 來表示取代時要取出的群組內容。其他工具或正規表示式引擎也可能使用 \1、\2、\3 等寫法。

另外,在日文系統或某些字型中,反斜線 \ 有時會顯示成半形日圓符號 ¥。

搜尋式不變,只改取代順序也可以

搜尋式仍然是:

(\d{4})年(\d{1,2})月(\d{1,2})日

只要改變取代字串,就能得到不同格式。

例如:

  • $2/$3/$1 → 9/1/2026
  • $3/$2/$1 → 1/9/2026
  • $1-$2-$3 → 2026-9-1

並不是重新搜尋年月日,而是決定剛才保存好的三段內容要用什麼順序重新組合。

「年」「月」「日」為什麼沒有被留下來?

再看一次搜尋式:

(\d{4})年(\d{1,2})月(\d{1,2})日

年、月、日 雖然是搜尋條件的一部分,但沒有放在括號裡。

因此,它們會參與搜尋,卻不會被存進 $1、$2、$3。

也就是說,可以把:

  • 搜尋時需要,但取代後不想留下的文字
  • 搜尋後還要繼續使用的文字

分開處理。

這正是擷取群組很實用的地方。

$1 裡的內容每次都可能不一樣

$1 並不是永遠等於 2026。

例如 2025年12月31日:

  • $1 → 2025
  • $2 → 12
  • $3 → 31

而 1999年1月10日 則是:

  • $1 → 1999
  • $2 → 1
  • $3 → 10

所以 $1、$2、$3 並不代表某個固定數字。

比較好理解的方式,是把它們看成「指向當次搜尋結果的暫存盒」。

如果有寫程式的經驗,也可以把這個概念想成有點類似暫時使用的變數。

取代並不會「理解」文字的意思

假設原文是:

2026年09月01日

使用:

$2/$3/$1

取代後會得到:

09/01/2026

而不是:

9/1/2026

因為 $2 裡存的是 09,$3 裡存的是 01。

正規表示式不會判斷「這是月份,所以前面的 0 可以拿掉」,也不會替數字做運算。

它只是把搜尋時記住的文字原樣拿出來,再放到指定的位置。

實務上可以拿來做什麼?

這篇用日期來說明,是因為數字最容易看出「抓到哪裡、又放到哪裡」。

但擷取群組當然不只可以保存數字。

像 portion、electrode 這類單字,甚至是由多個單字組成的名詞片語,也可以搜尋、保留下來,再放進新的字串裡。

例如技術文件裡反覆出現:

the portion where an electrode is provided

如果想統一成:

the portion on which an electrode is provided

即使其中的 portion 或 electrode 在不同句子中換成其他單字或名詞片語,也可以把變動的部分擷取下來,再原封不動地放回取代後的句型中。

換句話說,正規表示式處理的不一定是完全相同的字串,也可以是:

文字內容會變,但整體結構相同的模式。

單字與名詞片語的搜尋

這篇刻意先用數字來說明,是為了把擷取群組與取代的機制看清楚。至於如何用正規表示式搜尋會變動的單字、名詞片語以及其他文字模式,會在之後的文章中再另外介紹。

在翻譯與 QA 工作裡,「字本身每次不同,但句型或結構重複出現」的情況並不少見。這正是擷取群組特別好用的地方。

memoQ 的搜尋與取代也可以使用這種方式。一次大量取代之前,建議先確認搜尋結果,確定只有預期的內容會被修改。

這次先記住這幾件事

把之後還要用的部分用括號括起來:

(\d{4})年(\d{1,2})月(\d{1,2})日

括號會從左到右對應:

$1、$2、$3……

接著在取代字串中,按照需要的順序把它們放回去:

$2/$3/$1

於是:

2026年9月1日

就可以變成:

9/1/2026

一開始看到括號和 $1 可能會覺得有點陌生,但概念其實很簡單:

先把需要的內容放進編號盒子,再按照想要的順序拿出來。

理解這一步之後,正規表示式就不只是「搜尋工具」,而是可以在保留重要內容的同時,大量重新整理文字格式的實用工具。