
CATツールで使える正規表現・第11回
この連載では、翻訳の現場で役に立つ正規表現を取り上げながら、memoQやTrados StudioのようなCATツールで利用できる正規表現について解説しています。
前回までで、正規表現で使用される14のメタ文字と、先読み・後読み・後方参照といった機能を紹介しました。今回は、それらを使って、特定の文字列があったりなかったりする翻訳単位を探してみましょう。
目次[非表示]
- 1.両方あるものを探せ
- 2.アサーションを重ねる
- 3.ないものを探せ
- 4.1つだけあるものを探せ
- 5.今回のまとめと次回の予告
- 6.川村インターナショナルの翻訳サービス
両方あるものを探せ
「田中」を含む翻訳単位を探してください、と言われたら、もちろん田中で検索します。正規表現を使うまでもありません。「田中」と「鈴木」のどちらかを含む翻訳単位なら、田中|鈴木で検索できます。では、「田中」と「鈴木」の両方を含む翻訳単位を探すことはできるでしょうか。
翻訳単位のどこかに「田中」があって、その後に文字がいくつかあって「鈴木」がある、と考えれば、正規表現は田中.*鈴木となります。でも、田中さんが鈴木さんより先とは限りません。鈴木さんが先でも検索できるようにするには、田中.*鈴木|鈴木.*田中とする必要があります。
田中さんと鈴木さんの2人なら、これでよいのですが、「田中」と「鈴木」と「佐藤」をすべて含む翻訳単位を検索したいとなったらどうでしょう。3つの文字列が出現する順序として可能な組み合わせは6通りあります。そのそれぞれを「|」でつなぐ、というのは御免被りたいですね。
アサーションを重ねる
結論から言うと、「田中」と「鈴木」の両方を含む翻訳単位は、先読みを使って^(?=.*田中)(?=.*鈴木).*で検索できます。でも、どうしてこれで検索できるのでしょうか。
最初の^が翻訳単位の冒頭にマッチしようとしますが、先読みアサーションがあるので、すぐにはマッチできません。まず、その直後が.*田中にマッチするかどうか、すなわち翻訳単位に「田中」が含まれているかどうかが調べられます。
翻訳単位に「田中」が含まれていなければ、条件が満たされないので、^がどこにもマッチできません。そのため、この正規表現は、「田中」を含まない翻訳単位にはマッチしません。
一方、翻訳単位に「田中」が含まれていれば、^(?=.*田中)が翻訳単位の冒頭にマッチしようとします。しかし、先読みアサーションがもう1つあるので、まだマッチできません。次に、翻訳単位に「鈴木」が含まれているかどうかが調べられます。
ここで重要なことは、先読みアサーションが0幅マッチであるため、「鈴木」の検索が翻訳単位の冒頭から始まるということです。言い換えると、「田中」が見つかったら、検索開始位置が冒頭に戻ります。そのため、出現順序を気にする必要がないのです。
翻訳単位に「鈴木」も含まれていれば、はれて条件が満たされ、^(?=.*田中)(?=.*鈴木)が翻訳単位の冒頭にマッチします。そのあとの.*はどんな文字列にも貪欲にマッチするので、この正規表現が翻訳単位全体にマッチするというわけです。
これなら、「田中」と「鈴木」と「佐藤」のすべてを含む翻訳単位も^(?=.*田中)(?=.*鈴木)(?=.*佐藤).*で検索できます。条件がいくつになっても、もう怖くありません。
なお、このような正規表現は翻訳単位全体にマッチするので、^(?=.*田中).* は、1つの翻訳単位の中に「田中」がいくつあっても、1度だけマッチします。
ないものを探せ
では、反対に、特定の文字列を含まない翻訳単位を探すことはできるでしょうか。
特定の文字を含まない翻訳単位なら、文字クラスの否定を使って、簡単に検索できます。たとえば、半角数字を含まない翻訳単位は、最初から最後まで半角数字以外の文字が続けばよいのですから、^[^0-9]*$で検索できます。
しかし、2文字以上の文字列を含まない翻訳単位となると、文字クラスの否定を使ったのでは、複雑怪奇な正規表現を書かなければなりません。2文字なら、たとえば「田中」を含まない翻訳単位は^[^田]*(田([^田中][^田]*)?)*$と、まだ手に負えますが(解説は長くなるので控えます)、3文字以上は考えたくもありません。
うれしいことに、ここでも先読みが使えます。たとえば「田中」を含まない翻訳単位は、先読みの否定を使って^(?!.*田中).*で検索できます。
「田中」と「鈴木」のどちらも含まない翻訳単位なら、^(?!.*田中)(?!.*鈴木).*でも検索できますが、「(Aがない)かつ(Bがない)」は「(AまたはB)がない」と同じ(ド・モルガンの法則)なので、^(?!.*(田中|鈴木)).*とすることもできます。
1つだけあるものを探せ
もちろん、肯定と否定を組み合わせることもできます。そこで、「田中」を1つだけ含む翻訳単位を、「田中」を含むが「田中」2つは含まないと考えて、^(?=.*田中)(?!(.*田中){2}).*で検索できます。
もっとも、「田中」を1つだけ含む翻訳単位は(?<!田中.*)田中(?!.*田中)でも検索できます。「田中」はあるが、その前にも後にも「田中」がないというわけです。なお、この正規表現は、翻訳単位全体でなく「田中」のみにマッチします。
今回のまとめと次回の予告
今回は、正規表現を使った検索の総まとめとして、特定の文字列があったりなかったりする翻訳単位を検索する方法を紹介しました。この連載でまだ触れていない正規表現も若干ありますが、正規表現による検索はこれくらいにしようと思います。
しかし、正規表現が力を発揮するのは、検索だけではありません。次回は、この連載の締めくくりとして、正規表現を使った置換について解説します。
川村インターナショナルの翻訳サービス
川村インターナショナルでは、AIや機械翻訳の活用、プロセスの自動化やデジタル化による翻訳業務効率化ソリューションをご提案します。翻訳支援ツールの導入を検討している、自社の翻訳資産を活用して機械翻訳エンジンをカスタマイズしたい、など翻訳業務の効率化をご検討中の方は、ぜひお気軽にお問い合わせください。
関連記事