みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

正規表現でのパイプ(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]
というように書き換えると、うまくいくのでしょうか?
やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

投稿日時 - 2007-05-31 22:16:55

QNo.3046616

すぐに回答ほしいです

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

ブラケットの中は独立したキャラクタとして扱われるので文字列をそこに収めることはできません。
#これは#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/

を頑張って読破しましょう。

投稿日時 - 2007-06-01 02:23:01

お礼

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

投稿日時 - 2007-06-02 15:21:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

例えうまく行っても 結局文字列を展開し正規表現検索にかかるので変らない。
それどころか展開する分だけ遅くなる
実際は うまくいかない。
[]は1文字でしか定義できないから。

orでダメなら複数回実行しかないと思う。
(速度的には判らないけれど複数実行の方が早い事もある。場合による)

投稿日時 - 2007-05-31 22:44:21

お礼

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

投稿日時 - 2007-06-02 15:19:50

あなたにオススメの質問