正規表現とマクロ作成で最初にすべきことはデータの規則性を見つけることです。ところが、人間が作るものには間違いやユレが潜んでいることも多々あります。そのようなときは、正しい形、最適な形に修正する必要があります。そうしないと正規表現の力を十分に活用できません。以下、ありがちなデータの問題、その問題箇所の発見方法と修正方法について紹介いたします。
一部Wordなどのワイルドカードにも触れますがご了承ください。
なお、正規表現の基礎については、以前の記事「翻訳の確認にも役立つ正規表現(基礎編)」をご覧ください。
Contents
1. 規則性がある場合の正規表現での検索
目の前にHTMLファイルがあり、太字の文字列だけを探したいとします。<bold>と</bold>、あるいは<strong>と</strong>タグを検索、あるいはgrepすればよいですね。
パターンとしては、「</*bold>」や「</*strong>」とすれば、それぞれの開始タグと終了タグを検索できます。
タグと文字列をまとめて検索したければ「<bold>[^<].*</*bold>」や「<strong>[^<].*</*strong>」とすればよいですね。
データはそれぞれルールの上に作成されています。ルールが守られていれば、それにしたがって検索や置換といった処理が容易にできます。
2. 規則性がない例
では、規則性がないとはどのような場合が考えられるでしょうか。ありがちな例を挙げてみます。
不要な改行
Word、あるいはFrameMakerやInDesignといったDTPデータを見ていると、文の途中で改行されていることがあります。レイアウトを調整する際、Enterを押して改行するという安易な作業をしている結果です。データの作りに精通しているオペレーターはこのようなことはしないでしょう。(やむを得ずそうする場合もありますが。)
このような文の途中での改行は翻訳支援ツールを使って翻訳する場合じゃまになります。改行位置でセグメントが分割されてしまうためです。これを防ぐためには事前に不要な改行を削除してから翻訳を始めるなど、非常に面倒な手間が必要になります。
それ以上に困るものとして、用語の途中で改行されている例を目にすることもあります。
<p>...(省略)...<strong>Regular Expression</strong>...(省略)...</p>
なぜこのようにしているのか意図は分かりませんが、HTMLソースファイルで何度となく見たことがあります。これだと「<strong>[^<].*</*strong>」ではマッチしません。
タグの不備
HTMLの作成者がHTMLエディタを使っているとは限りません。テキストエディタを使用して1文字1文字手で入力してコーディングしているとしたら次のようなミスが考えられます。
- 「/bold>」や「</strong」のように「<」か「>」が不足している
- 「</stromg>」のようなスペルミス
こうなると、やはり「<strong>[^<].*</*strong>」ではマッチしません。
3. 規則性がない場合の対処
不要な改行を削除する(WordやDTPアプリの場合)
WordやDTPアプリであれば、不要な改行を目視で見つけて修正します。または、以前「ソフトリターンとハードリターンの違いって」でご紹介したワイルドカード「^13」(段落記号)、「^11」(改行記号)で検索して該当箇所を探してもよいかもしれません。
いずれにしても手間はかかりますが、改行が不要かどうかは目で見て判断する必要があり、やむを得ないでしょう。
不要な改行を削除する(HTMLやXMLの場合)
HTMLやXMLといったマークアップ言語であれば、基本として各行はタグで始まりタグで終わっていると考えられます。そのため、タグ以外の文字で開始している、あるいはタグ以外の文字で終了している行を探すのがよいでしょう。
また、コードの読みやすさを考慮して、行頭をスペースやタブでインデントしている場合もあります。行末のタグの後ろになぜかスペースやタブが入っている場合もあります。行末のスペースやタブには意味はないと思いますが。
行頭がタグ以外の文字で始まっているものは次のパターンで検索できます。
^[^<|\n]+
行末がタグ以外の文字で終わっているものは次のパターンで検索できます。
[^>|\n]+$
これを合わせて次のようにすると行頭と行末を検索できます。
^[^<|\n]+|[^>|\n]+$
行頭がタグ以外の文字で始まっていて、タブやスペースによるインデントを無視する場合は、次のパターンで検索できます。
^[^<|\n]*[^<|\n|\t| ]+
行末がタグ以外の文字で終わっていて、スペースやタブがあっても無視する場合は、次のパターンで検索できます。
[^>|\n|\t| ]+[^>|\n]*$
これを合わせて次のようにすると行頭と行末を検索できます。
^[^<|\n]*[^<|\n|\t| ]+|[^>|\n|\t| ]+[^>|\n]*$
このようにすると、用語の途中で改行されている箇所を発見することができます。
タグの不備(「<」か「>」が不足している)
タグの記述が不完全なもの、つまり「<」か「>」が不足している場合、次の手順で問題個所を発見できます。対象ファイルを操作するため、コピーを作成して次の手順を試してください。
- 「<」を「\n<」に置換する
- 「>」を「>\n」に置換する
- 「<[^>|\n|\t]*$|^[^<|\n|\t]*>$」で検索する
あるいはW3C Markup Validation Serviceなどを使ってデータの検証をしても問題個所を検出してくれます。
タグの不備(スペルミス)
W3C Markup Validation Serviceなどを使ってデータの検証をするのが一番です。
4. まとめ
以上のように、正規表現を使って問題個所を特定することもできますし、Validateのサービスを使ってエラー箇所を検出することもできます。データを整えることができれば、正規表現を使ってあらゆる操作が可能になります。
いろいろ試し、正規表現に慣れ、効率化につなげて頂ければ幸いです。
コメント