• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コメントアウト以外を置換対象とする正規表現について質問です。)

正規表現でコメントアウト以外を置換する方法とは?

このQ&Aのポイント
  • コメントアウト以外を置換対象とする正規表現について質問です。
  • 複雑な条件を満たす正規表現を使わずに、コメントアウト以外の特定の文字列を置換する方法を知りたいです。
  • 現在のコードが非効率的であり、より簡潔でクリーンなコードを作りたいです。

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

全ての条件をクリアしているかはわかりませんが。 s{(//.*?\n|/\*.*?\*/|abcde)}{$1 eq 'abcde' ? 'aaaaa' : $1}egs;

async
質問者

お礼

回答ありがとうございます!とてもシンプルな置換ですね! コメント文と対象文字列をor取りして、後でコメント文のマッチを回避する方法、 とても勉強になりました。検索・置換回数もNo.2のご回答より少なくて済みそうです。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

とりあえず質問の例は置き換えることができます。なお、面倒なので非格納型の丸括弧は使っていません。 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 */

async
質問者

お礼

素早い回答ありがとうございます! 目からウロコが大量に流れ出ました。このような方法で コメントアウト中の対象文字列マッチを回避することが出来るのですね! 本質ではありませんが、eオプションを使わずに 3項間演算子を計算させるための配列@{[...]}の使い方に感動しました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと考えなきゃならないことがあって, 例えば /* * abcde // */ abcde */ とあったときにどうなっているとうれしいんでしょうか?

async
質問者

補足

ご回答ありがとうございます。 これは・・・ 複数行コメント内にある//は、 コメントアウトとして機能しない。 として処理してほしいです。 逆に以下のような場合は(文法誤りですが)、 1行コメント優先で処理をしてほしいです。 // /* abcde */ ただ、前提として ・プログラムが文法的に正しいこと を追加させて下さい。 つまりご提示されたケースは対象外とさせて下さい。 #強制実行したら2番目のabcdeが置換対象になると思います。