\d、\d+、\d{4}、^、$ などの正規表現の記号が淡い背景に浮かぶイメージ

少し間が空きましたが、正規表現シリーズの第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 のいずれかで、部材名が2語以上になる場合もあります。

今回変えたいのは where を on which にする部分だけです。場所や部材を表す語、冠詞は元のまま残します。つまり、前後の単語が変わっても、同じ文型を探して、必要な部分だけを置き換えるのが目標です。

ただし、これは where と on which を自由に置き換えてよいという意味ではありません。on which が適切なのは、対象の上に部材が設けられるなど、前置詞 on に対応する位置関係が文脈から確認できる場合です。上の例は、そうした確認が済んでいるものとして話を進めます。

where だけを検索しない理由

where だけを探して機械的に置き換えると、関係のない用例まで変更してしまいます。今回探したいのは、あくまで先ほどのような the ... where ... is provided という形です。

そこで、前後の語を検索条件に含めます。ただし、part や terminal のように文によって変わる語まで固定してしまうと、ほかの例を拾えません。

この「変わる語を検索し、置換するときには残す」という場面で、前回のキャプチャグループが役に立ちます。

空白以外の文字を探す──\S

前回は数字1文字に一致する \d を使いました。今回は、単語が入る位置を表すために \S を使います。

\S は、空白以外の1文字に一致します。ここに「1回以上の繰り返し」を表す + を付けると、

\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 に変え、残しておきたい portion と electrode を $1、$2 で戻しています。

これで、portion の位置が part や section に変わっても、空白のない1語であれば同じ位置の文字列を取り出せます。ただし、この段階では冠詞が 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

括弧が3組になったため、取り出す内容も3つになります。

グループ取り出す内容the section where the sensor is provided の場合
$1where の前の語section
$2冠詞(a、an、the)the
$3冠詞の後の語sensor

3つのキャプチャグループを $1・$2・$3 として取り出し、必要な表現だけを変更するイメージ

括弧で囲んだ部分だけを番号で取り出し、元の冠詞や名称を残して置換します。

冒頭で示した an electrode、a terminal、the sensor の3つの例は、いずれもこの式で検索できます。冠詞を置換先で書き直しているわけではありません。元の文にあった冠詞を $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]+?

+? は「1回以上」という条件を保ったまま、できるだけ短い一致から試す指定です。後ろに 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 となります。部材名の語数を1語や2語に限定する必要はありません。

最短一致でも、検索結果の確認は必要

次の文を検索した場合、$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空白以外の1文字に一致する
\s空白、タブ、改行などの空白文字に一致する
|「または」。冠詞などの候補を指定できる
[ ]角括弧内のいずれかの文字に一致する
[^ ]角括弧内に指定した文字以外に一致する
+?1回以上の繰り返しを、できるだけ短く一致させる

今回の例では、句読点と改行を除外しながら、空白を含む複数語の名称も検索できるようにしました。

検索

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

置換

the $1 on which $2 $3 is provided

前回は数字を括弧で囲んで並べ替えましたが、今回は文の中で変化する単語や冠詞を取り出し、置換後に戻しました。さらに、空白を含めたいのか、どの記号を境界にしたいのか、どこで一致を止めたいのかも考える必要があることが分かりました。

次回はmemoQで試してみます

ここまでの4回で、正規表現を使った検索と置換の基本を見てきました。次回からはmemoQの翻訳エディタに移り、検索・置換やテキストフィルタを使って、実際にどのように検索結果を確認し、必要な箇所だけを修正するかをご紹介します。