- ベストアンサー
正規表現でコメントアウト以外を置換する方法とは?
- コメントアウト以外を置換対象とする正規表現について質問です。
- 複雑な条件を満たす正規表現を使わずに、コメントアウト以外の特定の文字列を置換する方法を知りたいです。
- 現在のコードが非効率的であり、より簡潔でクリーンなコードを作りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
全ての条件をクリアしているかはわかりませんが。 s{(//.*?\n|/\*.*?\*/|abcde)}{$1 eq 'abcde' ? 'aaaaa' : $1}egs;
その他の回答 (2)
- kumoz
- ベストアンサー率64% (120/185)
とりあえず質問の例は置き換えることができます。なお、面倒なので非格納型の丸括弧は使っていません。 use strict; my $str = join '', <DATA>; $str =~ s/((\/\*.*?\*\/|\/\/.*?\n|[ \n]*)*)((abcde)?)/$1@{[$3 ? 'aaaaa' : '']}/sg; print $str; __DATA__ /* abcde fghij */ abcde fghij /* abcde fghij */ abcde fghij // abcde fghij abcde fghij /* abcde fghij */ abcde fghij /* abcde fghij */
お礼
素早い回答ありがとうございます! 目からウロコが大量に流れ出ました。このような方法で コメントアウト中の対象文字列マッチを回避することが出来るのですね! 本質ではありませんが、eオプションを使わずに 3項間演算子を計算させるための配列@{[...]}の使い方に感動しました。
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと考えなきゃならないことがあって, 例えば /* * abcde // */ abcde */ とあったときにどうなっているとうれしいんでしょうか?
補足
ご回答ありがとうございます。 これは・・・ 複数行コメント内にある//は、 コメントアウトとして機能しない。 として処理してほしいです。 逆に以下のような場合は(文法誤りですが)、 1行コメント優先で処理をしてほしいです。 // /* abcde */ ただ、前提として ・プログラムが文法的に正しいこと を追加させて下さい。 つまりご提示されたケースは対象外とさせて下さい。 #強制実行したら2番目のabcdeが置換対象になると思います。
お礼
回答ありがとうございます!とてもシンプルな置換ですね! コメント文と対象文字列をor取りして、後でコメント文のマッチを回避する方法、 とても勉強になりました。検索・置換回数もNo.2のご回答より少なくて済みそうです。