パイプを使う
前回は、「」内で使用できるメタ文字の活用方法を紹介しましたが、ブラケット内では「|(パイプ)」「()(パーレン)」を使ったメタ文字を使うことで、より柔軟なマッチングが可能になります。しかし、どちらも単独で使用できるメタ文字ですので、まずは基本的な組み合わせから紹介しましょう。
まずは下記の結果をご覧ください。「月」からはじまる複数の文字列に対して「月下|月光|月夜」と検索しますと、単純にその3文字がマッチしています。「|(パイプ)」は、左右に置かれた文字列のいずれかにマッチする単純なメタ文字で、検索サイトなどでWeを検索時の文字列に指定する「OR検索(いずれかにマッチします)」と例えれば、わかりやすいでしょう。
正規表現
検索:月下|月光|月夜
Target
月下 月額 月刊 月刊 月給 月光
月産 月謝 月食 月蝕 月足 月夜
Search Result
月下 月光 月夜
ここでブラケットによる複数文字へのマッチングを思い出してください。ブラケットで同様のマッチングを行なうには、「[月[下光夜]]」と検索すれば簡単ながらも、ブラケットが対応するのはあくまでも一文字単位。複数文字列へのマッチングも可能ですが、正規表現の表記が難しくなります。
一方のパイプには、そのような制限がないため、四文字熟語など複数文字列に対して使用する時に効果を発揮します。下記のような文字列がある場合、「花鳥風月|月下氷人」と検索すれば、「花朝月夕」「月下氷人」のふたつがマッチ対象となるように、文字数やシステム的制限がかからないかぎり、大量の文字列を指定することが可能です。複数文字列をマッチ対象にする際にご活用ください。
正規表現
検索:花鳥風月|月下氷人
Target
一月三舟 雲壌月鼈 雲心月性 屋梁落月 嘉辰令月
花朝月夕 花鳥風月 鏡花水月 月下氷人 月卿雲客
Search Result
花朝月夕 月下氷人
パイプの活用方法としては、同種の意味を持ちながら異なる表記に対して置換を行なうと良いでしょう。例えば「書類」という単語を外来語で表記すれば、「ドキュメント」や「ペーパー」となります。これをすべて「文書」という単語に置き換える場合は、対象となる文字列をすべて「書類|ドキュメント|ペーパー」とパイプでつなぎ、置き換える単語を置換で指定すれば、容易に置換操作が可能になります。
正規表現
検索:書類|ドキュメント|ペーパー
置換:文書
Target
この書類をAさんに渡そうとしたところ、「ドキュメントは共有フォルダに入れてください」と言われ、Bさんは「ペーパーは印刷してくれ」と言いました。~
Search Result
この文書をAさんに渡そうとしたところ、「文書は共有フォルダに入れてください」と言われ、Bさんは「文書は印刷してくれ」と言いました。~
パイプとパーレンを使った処理
パイプは「()(パーレン)」と組み合わせることで、より使いやすくなります。先ほど、パイプを用いて「月」からはじまる複数の文字列にマッチさせる正規表現を紹介しましたが、複数のパターンにマッチさせるのにパイプを用いますと、一歩間違えれば冗長性を増すため可読性の低下につながりかねません。そこで用いるのがパイプです。
先の例に用いた文字列は、「月」で始まり、すべて異なる漢字が使われています。これを逆手に取れば、正規表現は「月(下|光|夜)」で事足ります。下記の結果をご覧になればわかるように、対象となる文字列や結果は同じながらも、パイプとパーレンを組み合わせることで、正規表現も少しだけシンプルになります。
正規表現
検索:月(下|光|夜)
Target
月下 月額 月刊 月刊 月給 月光
月産 月謝 月食 月蝕 月足 月夜
Search Result
月下 月光 月夜
先に紹介した正規表現「月(下|光|夜)」を見て、首をかしげた方は正規表現に対して理解を深め始めています。なぜならこの正規表現は、以前の記事でも紹介したブラケットを用いれば、「月[下光夜]」と表現することもできるため、パーレンの優位性に疑問を覚えることでしょう。
そもそもブラケットは、括弧内の一文字または正規表現のいずれかひとつをマッチ対象とし、文字列として書かれている文字列は各一文字として扱われます。一方パーレンは、括弧内の文字列をそのままマッチ対象としますが、先のパイプを用いることで、複数の文字や文字列をひとつのブロックとして扱えます。つまり前者はキャラクタクラス指定であり、後者はグルーピング指定と呼ばれるように、求められるものが異なるのです。
異なる性格ながらも、組み合わせに制限を設けていないのが正規表現の便利なところ。ブラケットとパーレンを組み合わせることで、複数の文字列をマッチングできます。それでは応用をひとつ紹介しましょう。月齢を指す言葉は様々なものがありますが、ここでは、それらから「上弦の月」「下弦の月」「弦月(げんげつ)」に関して検索してみます。
まず「上弦の月」「下弦の月」のふたつは先頭にある「上」「下」以外の相違点はありません。そのため、ここでは「[上下]弦の月」とブラケットで相違点を囲めばマッチ対象となりますが、同時に「弦月」を対象に加えるには「[上下]弦の月|弦月」と表記すれば良いのですが、まだまだ最適化の余地を残しています。
「[上下]弦の月|弦月」をよく見れば、パイプで区切った各文字列の末尾は「月」が同じになっています。ここは略すにはパーレンを使用し、共通部分を削りましょう。具体的には、「([上下]弦の|弦)」の「上(下)弦の」と「弦」をグルーピング指定します。続いて共通項である末尾の「月」を加えることで、「([上下]弦の|弦)月」という正規表現が完成しました。
この正規表現は"「上(下)弦の」もしくは「弦」のいずれかを持ち、その続きとして「月」を持つ文字列"にマッチします。このように共通項を最適化することで、より多くの範囲を持つ正規表現を記述することが可能ですが、最適化を行なうことで可読性が低くなるというデメリットもあるため、その点だけご注意ください。
正規表現
検索:([上下]弦の|弦)月
Target
新月、朔
二日月、既朔
三日月
七日月、半月、上弦の月、弦月、弓張り月
十三日月、十三夜月
十四日月、小望月、幾望
十五日月、満月、望
十六夜、十六日月、既望
十七日月、立待月
十八日月、居待月
十九日月、寝待月、臥待月
二十日月、更待月
二十三日月、半月、下弦の月、弦月、弓張り月
二十六日月
二十七の月、晦
Search Result
上弦の月 下弦の月 弦月
阿久津良和(Cactus)