正規表現についてメモ

普段からなんとな~く使いつつもよく分かっていない正規表現について、ちょっと調べてみました。

■分からなかった点

「正規表現」の何が分からないか?それは「正規表現とは何なのか?」ということである(汗。つまり

「「\t」はタブ、「\n」は改行、「*」は全部にマッチしてくれる便利なやつ」

といった書式は知ってるけど、その他の事についてはよく知らなかった。学ぶ上で特に問題だったのが「正規表現の解説ページによって書いている内容が違う場合がある」こと。例えば秀丸の正規表現サクラエディタの正規表現では書式が違う箇所がある。けどどちらもも「正規表現」と名乗っている。これではどちらを参考にすればいいのか分からない。

■「正規表現」とは

なので、取り合えず「正規表現」という言葉について突き詰めてみることにした。思うに正規表現のイメージがいまいち掴み辛いのは「正規表現」と言われても日本語で意味が分からないからだと思う(つーか「正規」って言葉自体あまり使わないし)。なので書式だけ覚えてしまい「正規表現」という言葉が意味不明の記号化→「正規表現とは何か」と問われたときにうまく説明できないのである。

「正規表現」の原語は「Regular Expression」。「Regular」で辞書を引いてみると(Regularの訳)と「正規」という一言よりは「原則にのっとった、規則正しい」という意味に捉えたほうが分かりやすい(というか「正規」って意味不明だ)。「表現」ってのも落とし穴かも。Expressionの訳はちゃんと「表現(法){ひょうげん(ほう)}、表現{ひょうげん}すること、言い回し」って書いてあるのに、一番大事な「(法)」をスルーして「表現」にしちゃってるもんな。「正規表現」の働きを考えると「正規表現法」の方が正しい日本語訳に近いんじゃないだろうか?よって「正規表現」は

「決められたルールに従って、あるパターンの文字列を表現する方法」

と脳内変換した方がイメージが掴めて理解しやすい。

※ 実は正規表現 – Wikipediaに「文字列の集合を一つの形式で表現する方法」とか似たような説明が書いてあったりするのだけど、これは勉強。自分で調べて理解する過程が重要なので気にしない。

つまり正規表現とは単なる方法論でありメソッドだということだ。僕は今まで「正規表現標準書式」のような具体的な"モノ"があり、それをベースに実装しているものだと思ってたがこの理解は全くの誤りであった。「決められたルールに従って、あるパターンの文字列を表現」してさえいれば「正規表現を使っている」ことになる。なので他のアプリと正規表現の書式が違っても書式間違いではない、というか実装する人の勝手なのである。

一応僕はサクラエディタ使いなので、サクラエディタがbregexp.dllを使って正規表現処理は知っていたし、他の正規表現処理エンジンがある事も知っていた。だがそれらはせいぜい正規表現の処理ロジックとスピードが違うくらいだと思っていた。まさかdllによって書式の実装方法が違うとは思わなかった。

EmEditor で正規表現処理(2)

■正規表現の方言

実は正規表現はプログラム言語やアプリケーション環境によってメタ文字の種類や動作が微妙に異なっている。これを一般に「正規表現の方言」と呼ぶ。

ここでは EmEditor や秀丸エディタに実装されている jre32.dll という正規表現エンジンのケースで説明しているが、Perlという言語と同等の正規表現エンジンを採用しているサクラエディタや、独自の正規表現エンジンを実装している Emacs というエディタなどでは機能しないものもある。(たとえばこのページで登場する後方参照の "\1" は、Perl スクリプトやサクラエディタでは "$1" と記述する。)

…なるほど。まぁおそらく昔からの流れとか系譜があるんだろうな、と想像できる。

■思うに

正規表現をちょこっと解説したようなページで「正規表現ではこういう書式が使えます」と言ってしまうのが良くない。これを聞くと「正規表現に対応している=その書式が全て使える」と理解してしまう。確かに基本的な書式は一緒だが、一部の書式は使えないのが悪質混乱の種となっている。なので

正規表現の書式ページを見る→覚える→
違う正規表現書式のアプリで使う→失敗→なんでやねん

ということになる。

■まとめ

  • 「正規表現」とは方法論
  • 正規表現はアプリによって書式が異なる
  • 正規表現を使用するときには正規表現エンジンと対応書式を確認する

(いつも通り)予定外に長文になったので切り。