今回はちょっと趣向を変えて、テキストファイルをHTMLに変換する正規表現をいくつか紹介しましょう。ひとつめはテーブル化。我々PC系ライターが原稿を納品する際、記事内で表を挿入する場合はタブで区切った文字列を用意することがよくあります(図1、2)。

図1 今回の置換対象となる表は画面のように、ひとつのタブで区切った状態を想定しています

図2 ちなみに初期状態でタブは表示されません。秀丸の場合、[その他]メニューから[ファイルタイプ別の設定]を選んで表示されるダイアログの「デザイン」を選択。「タブ文字」にチェックを入れることで表示されます

この原稿を納品しているMYCOMジャーナルのように、多くのウェブニュースサイトでは原稿をHTML化し、掲載にいたっています。多くは自動化されているそうですが、特殊な表などは手動でHTMLタグを追記しなければならないこともあるとか。文書編集における正規表現のポイントは"面倒な作業を簡単に終わらせる"ことにあるため、今回のような例にはうってつけでしょう。

<table>
  <tr>
    <td>商品</td>
    <td>価格</td>
  </tr>
  <tr>
    <td>パソコン</td>
    <td>200000円</td>
  </tr>
  <tr>
    <td>キーボード</td>
    <td>5000円</td>
  </tr>
  <tr>
    <td>マウス</td>
    <td>2000円</td>
  </tr>
</table>

まず完成図となるHTMLを想定すると囲みのように、行頭は「<tr>」タグと「<td>」タグではじまり、タブで区切られた部分は「</td>」タグと「<td>」タグ、行末は「</td>」タグと「</tr>」となります。

この場合の正規表現を思案しますと、行頭を意味するキャレットと、行末を意味するドル記号がポイントになります。まずはキャレットを用いて検索文字列を「^」、置換文字列を「<tr><td>」とすれば、簡単に行頭の処理が完了しました(図3)。

図3 行頭にHTMLタグが挿入されます

次はタブ区切りの置換。タブを正規表現で表わすには、エスケープシーケンスの「\t」となりますので、検索文字列を「\t」、置換文字列を「</td><td>」とすれば完了です。行末も行頭と同じように行末を表わすドル記号を使用し、検索文字列を「$」、置換文字列を「</td></tr>」とすれば、ご覧のようにタブ区切りのテキストをHTML形式に変換できました(図4~5)。

図4 タブがHTMLタグに置き換わります

図5 行末にHTMLタグが挿入されます

しかしこれでは、個別に操作するのは煩雑になってしまいます。そこで一括して置換をおこなう正規表現に変更してみましょう。基本的には前述した検索文字列と置換文字列をつなぎ合わせるだけですが、表テキストを置換対象に埋め込むため、タグ付き正規表現を併用しましょう。

改行を除く任意の一文字を表わすピリオドと、直前文字列を0回以上繰り返すアスタリスクをタグ付き正規表現で囲むと「^\f.*\f\t\f.*\f$」となります。置換文字列にも同じように、タグの間へ「\1」と「\3」を埋め込むことで「<tr><td>\1</td><td>\3</td></tr>」となり、今回のサンプルとなったテキストをHTMLに変換できます(図6)。

図6 置換ダイアログを開き正規表現を入力して、[全置換]ボタンをクリックすれば、一括してHTMLタグに置換できます

正規表現

検索文字列:^\f.*\f\t\f.*\f$
置換文字列:<tr><td>\1</td><td>\3</td></tr>

自動化マクロを作成する

残念ながら、これで完成ではありません。HTMLをご存じの方ならお気づきのとおり、HTMLで表を作成するには「<table>」および「</table>」タグが必要です。これは単なる文字列の挿入となるため、正規表現では対応しきれません。そこで秀丸のマクロ機能を使ってみましょう。

秀丸マクロで文字列を挿入するには「insert」文を使用します。今回は「<table border="1"」という1行の文字列を行頭に挿入しなければなりませんので、「insert "<table border=\"1\">\n";」と記述しましょう。ちなみにダブルコーテーションの前にある半角円記号は、ダブルコーテーションが文字列であることをしめすために用いています。

以前と同じように置換は「replaceallfast」文を使用しますが、先の囲みを見ると「<tr>」および「</tr>」タグの前には半角スペース2文字分のインデントが、「<td>」タグには4文字のインデントが挿入されています。これを再現するため、

 replaceallfast "^\\f.*\\f\\t\\f.*\\f$", "  <tr>\n    <td>\\1</td>\n    <td>\\3</td>\n  </tr>", regular, inselect;

と各タブの前に半角スペースを挿入してください。

後は末尾に「insert "\n</table>";」と記述すれば完成です。このマクロを任意のファイル名で作成しておきましょう。秀丸マクロの保存先は「動作環境」ダイアログの「環境」で指定可能です。初期状態では秀丸をインストールしたフォルダとなっていますので、必要に応じて変更してください(図7)。

図7 「insert」文と「replaceallfast」文を用いて秀丸用マクロを作成します。マクロファイルは秀丸をインストールしたフォルダなど任意の場所に保存してください

後は秀丸のマクロ実行機能で作成したマクロファイルを実行すれば、囲みにあるようなHTMLファイルに変換されます(図8~9)。

図8 マクロを実行するには[マクロ]メニューから[マクロ実行]を選択します

図9 ダイアログが表示されたら図7で作成したファイルを選択して[OK]ボタンをクリックしてください

図10 こちらがマクロの実行結果。ご覧のようにHTMLのインデントまで再現されました

阿久津良和(Cactus)