• ベストアンサー

正規表現でのパイプ(or)を減らしたいのですが

いつもお世話になっています。 正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、 /a|b|c/ ---> [abc] のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、 /abc|def|ghi/ ---> [(abc)(def)(ghi)] だと多分ダメですよね(今実行環境が無く確認できません)。 それで、各々の単語を $a = 'abc'; $d = 'def'; $g = 'ghi'; のようにあらかじめ定義しておいて、 /$a|$d|$g/ ---> [$a$d$g] というように書き換えると、うまくいくのでしょうか? やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ブラケットの中は独立したキャラクタとして扱われるので文字列をそこに収めることはできません。 #これは#1の方の回答にもあるとおり そんなに気になるのなら Regexp::Optimizer - optimizes regular expressions - search.cpan.org http://search.cpan.org/~dankogai/Regexp-Optimizer-0.15/lib/Regexp/Optimizer.pm このモジュールを使ってみるとか。 正規表現のマッチングを遅くする原因は色々あるので、 本当にその辺を知りたければ oreilly.co.jp -- Online Catalog: 詳説 正規表現 第2版 http://www.oreilly.co.jp/books/4873111307/ を頑張って読破しましょう。

aneja
質問者

お礼

早速のご回答、どうもありがとうございました。 やっぱり文字列はできないんですね。質問のような書き換えができないのなら、教えて下さったような最適化モジュールも検討してみます。

その他の回答 (1)

noname#39970
noname#39970
回答No.1

例えうまく行っても 結局文字列を展開し正規表現検索にかかるので変らない。 それどころか展開する分だけ遅くなる 実際は うまくいかない。 []は1文字でしか定義できないから。 orでダメなら複数回実行しかないと思う。 (速度的には判らないけれど複数実行の方が早い事もある。場合による)

aneja
質問者

お礼

早速のご回答ありがとうござました。やっぱりできないんですね。複数回実行もあわせて検討してみます。

関連するQ&A