淡色背景上的正規表示式符號,例如 \d、\d+、\d{4}、^ 與 $

隔了一段時間,正規表示式系列終於來到第四篇。

在上一篇「系列【正規表示式】──把搜尋到的內容重新排列再取代」中,我們示範了如何用括號擷取日期中的年、月、日,再透過 $1、$2、$3 調整排列順序。

這次,我們要用同樣的概念來處理英文句型。

哪些內容要改?哪些必須保留?

假設英文技術文件中出現了以下幾種寫法:

修改前修改後
the portion where an electrode is providedthe portion on which an electrode is provided
the part where a terminal is providedthe part on which a terminal is provided
the section where the sensor is providedthe section on which the sensor is provided
the surface where a wiring layer is providedthe surface on which a wiring layer is provided
the substrate where a thin insulating wiring layer is providedthe substrate on which a thin insulating wiring layer is provided

這幾個句子其實都有相同的基本結構:

the [表示位置或部位的詞] where [冠詞] [元件名稱] is provided

不過,where 前面的詞可能是 portion、part、section 或 surface;where 後面也可能是 an electrode、a terminal、the sensor 或 a wiring layer。冠詞有 a、an、the 三種,元件名稱也不一定只有一個單字。

我們要做的,是把 where 改成 on which,而位置、元件名稱及冠詞都維持原樣。換句話說,即使 where 前後的詞彙不同,也要找出相同的句型,只修改需要調整的部分。

不過,這不代表 where 和 on which 可以任意互換。只有在上下文確實表達「元件設置於某個表面上」等符合介系詞 on 的位置關係時,才適合這樣修改。以下先假設各例的技術意義都已確認。

為什麼不能只搜尋 where?

如果直接把所有 where 都換掉,其他不屬於這種句型的用法也可能受到影響。我們真正要找的,是前面例子那種 the ... where ... is provided 結構。

因此,搜尋條件需要包含前後的文字;但也不能把 part、terminal 等詞固定寫死,否則就找不到其他變化。

這時,上一篇介紹的擷取群組就派上用場了:先把會變動的詞納入搜尋,再於取代時放回原本的位置。

使用 \S 找出非空白字元

上一篇我們用 \d 比對一個數字。這次要處理單字所在的位置,可以使用 \S。

\S 會比對一個非空白字元。加上代表「一次以上」的 +,就成了:

\S+

它能將 portion、part、section、electrode、terminal 等沒有空白間隔的字元序列,視為一個整體來比對。

補充:\S 也會比對標點與符號

\S 並不只限於英文字母。連字號和斜線也不是空白,因此 heat-resistant、input/output 都能透過 \S+ 一次比對完整。不過,逗號、句點等標點符號也包含在內。所以,\S+ 找到的是「連續的非空白字元」,並不一定是語言學意義上的一個單字。

用括號擷取需要保留的詞

先從第一個例子 the portion where an electrode is provided 開始。

搜尋

the (\S+) where an (\S+) is provided

取代

the $1 on which an $2 is provided

括號內比對到的內容,可以在取代時重新引用。

擷取結果
$1 → portion
$2 → electrode

搜尋式中雖然也有 the、where、an、is provided,但這些部分沒有放進擷取群組。取代時,我們將 where 改寫為 on which,再利用 $1 和 $2 放回原本的 portion 和 electrode。

只要是沒有空白的一段文字,即使把 portion 換成 part 或 section,同樣可以擷取。不過,目前冠詞仍固定為 an。

使用 |,同時處理 a、an、the

接下來要處理冠詞不同的情況。若希望 an electrode、a terminal、the sensor 都能符合條件,可以使用垂直線符號 |。

(a|an|the)

意思是「a、an 或 the 其中之一」。因為外面有括號,實際比對到的冠詞也能在取代時保留。

搜尋

the (\S+) where (a|an|the) (\S+) is provided

取代

the $1 on which $2 $3 is provided

現在有三組括號,因此可以取出三個部分。

群組擷取內容以 the section where the sensor is provided 為例
$1where 前面的詞section
$2冠詞(a、an、the)the
$3冠詞後面的詞sensor

擷取群組 $1、$2、$3 與取代後文字的對應示意圖

將括號內的內容依群組編號放回取代後的句子,原有冠詞與元件名稱都能保留下來。

開頭列出的 an electrode、a terminal、the sensor 都能透過這個搜尋式找到。我們並不是在取代式中重新指定冠詞,而是用 $2 放回原文中的冠詞,所以 a、an、the 的差別不會消失。

多字元件名稱:[^…] 與 +?

目前使用的 \S+ 遇到空白就會停止,因此無法一次擷取下列例子中的完整元件名稱:

the surface where a wiring layer is provided

the substrate where a thin insulating wiring layer is provided

如果希望元件名稱中可以有空白,又不想讓搜尋範圍一路延伸到下一句,該怎麼做?

不排除空白,而是排除標點與換行

在方括號開頭加上 ^,代表比對「方括號中列出的字元以外」的字元。例如:

[^\s.,;:!?]+

這會排除代表空白字元的 \s,以及列出的標點。因此,這個寫法仍無法一次擷取含有空白的 wiring layer。

所以,在這次用來擷取元件名稱的部分,我們決定保留空白,但排除標點與換行字元:

[^.,;:!?\r\n]+

這裡排除句點、逗號、分號、冒號、驚嘆號、問號,以及換行字元 \r、\n。由於一般半形空白仍允許出現,wiring layer 和 thin insulating wiring layer 都能比對到。

注意,這裡的 ^ 位於方括號開頭,表示排除指定字元;與用來表示字串開頭的 ^ 用法不同。

使用 +?,停在第一個 is provided

但只要允許空白,就會遇到另一個問題:同一句裡若出現多次 is provided,原本具貪婪特性的 + 可能把不需要的部分也一併擷取。這時可以改用 +?:

[^.,;:!?\r\n]+?

+? 同樣表示「一次以上」,但會優先嘗試最短的比對範圍。後面接上 is provided,就會在第一個符合整段搜尋條件的位置完成比對;前面列出的標點與換行仍會阻止範圍繼續延伸。

整理後,搜尋式如下:

搜尋

the ([^\s.,;:!?]+) where (a|an|the) ([^.,;:!?\r\n]+?) is provided

取代

the $1 on which $2 $3 is provided

對 the surface where a wiring layer is provided 而言,$3 是 wiring layer;對 the substrate where a thin insulating wiring layer is provided 而言,$3 則是 thin insulating wiring layer。不必再限制元件名稱只能有一個或兩個單字。

即使使用最短比對,也要檢查結果

以下句子中,第一個 is provided 已滿足搜尋條件,所以 $3 只會擷取 wiring layer:

the surface where a wiring layer is provided and a protective film is provided

下列例子則不會跨越句點,延伸搜尋到下一句:

the surface where a wiring layer is formed. A protective film is provided

不過,下面這一句就需要特別留意:

the surface where a wiring layer is formed and a protective film is provided

此時,$3 會擷取 wiring layer is formed and a protective film。由於中間沒有被排除的標點,而後方又出現 is provided,整段文字仍符合搜尋條件。

也就是說,這個搜尋式能處理含有多個單字的元件名稱,卻無法理解名詞片語到哪裡結束、其他語法成分從哪裡開始。對未排除的符號或特殊格式,也必須保持留意。

另外,where 前面若是多個單字,或句型中沒有冠詞,就不在這次搜尋式的適用範圍內。更重要的是,把 where 改成 on which 是否保留原本的技術意義,仍須依上下文判斷,必要時並參照圖式。

先用正規表示式找出候選位置,再確認哪些地方適合修改。 尤其在專利說明書等技術文件中,這樣的使用方式相當重要。

本篇重點整理

表示式意義
\S比對一個非空白字元
\s比對一個空白字元,例如空格、定位字元或換行
|表示「或」,可用來指定不同冠詞等選項
[ ]比對方括號內列出的任一字元
[^ ]比對方括號內未列出的字元
+?比對一次以上,但優先嘗試最短範圍

在這次的例子裡,我們保留了元件名稱中的空白,同時排除指定標點與換行字元,讓搜尋式可以處理多字名稱。

搜尋

the ([^\s.,;:!?]+) where (a|an|the) ([^.,;:!?\r\n]+?) is provided

取代

the $1 on which $2 $3 is provided

上一篇我們擷取日期中的數字並調整順序;這次則擷取句型中會變動的詞和冠詞,再放回取代後的句子。過程中也看到了,除了找出目標文字,還必須考慮哪些位置可以有空白、哪些標點應該形成邊界,以及比對應在何處停止。

下一篇:在 memoQ 中實際操作

前四篇已經介紹了正規表示式搜尋與取代的基本概念。下一篇開始,我們將進入 memoQ 翻譯編輯器,看看如何搭配搜尋與取代功能、文字篩選器,找出符合條件的句型、檢查結果,再修改真正需要調整的地方。