トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

2-15 三銃士を検索

正規表現パズル

三銃士を検索する。
三銃士というのは、
アトス
アラミス
ポルトス
のことです

検索前


検索後


対象データ

アトス  [皆は一人の為に、一人は皆の為に]
アラミス[皆は一人の為に、一人は皆の為に]
ポルトス[皆は一人の為に、一人は皆の為に]


正規表現

アトス|アラミス|ポルトス

別解1

((ア(ト|ラミ))|ポルト)ス

別解2

(ア(ト|ラミ)|ポルト)ス


解説

こちらを参考にさせていただきました

正木氏は、すごい(名字も、正木で正規表現の正規だし)

別解は、パフォーマンスとしては、
共通文字列を取り出して、
スを共通文字列とすることにより、
BM法による高速化が期待できます

可読性よりも、パフォーマンスが要求される正規表現なら
共通文字列の取り出しを、
考える価値はあるでしょう

共通文字列を取り出すことによる、BM法については、
詳説 正規表現の(日本語版の二版)の
237ページに記述されてますね

なお、正規表現の変形順序は、以下の通り
アトス|アラミス|ポルトス
(アト|アラミ)ス|ポルトス
((アト|アラミ)|ポルト)ス
((ア(ト|ラミ))|ポルト)ス

さらに無駄な括弧を外して、
(ア(ト|ラミ)|ポルト)ス
としてもいいし、

最初から以下の順序で変形してもいいでしょう。
(数学の因数分解で、全体の因数を先に取り出す感覚です。)
アトス|アラミス|ポルトス
(アト|アラミ|ポルト)ス
(ア(ト|ラミ)|ポルト)ス

Boyer-Moore(BM)法