![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
コメントアウト以外を置換対象とする正規表現について質問です。
以下の(1)の入力に対して(2)の結果を得たいのですが、
綺麗な正規表現を使って置換する方法を教えて下さい。
とりあえず複数回に分けて無理やり置換したのですが、
とても汚いコードになってしまいました。。。
(前提)
・コメントは/*...*/ と //... の2種類
・コードは改行を含めて1変数に格納されている
・目的はコメントアウト以外の「abcde」を「aaaaa」に置換すること
(1)
----------------------------------------------------
/* abcde fghij */ abcde fghij /* abcde fghij */
abcde fghij // abcde fghij abcde fghij
/*
abcde
fghij
*/
abcde fghij /* abcde fghij */
----------------------------------------------------
(2)
----------------------------------------------------
/* abcde fghij */ aaaaa fghij /* abcde fghij */
aaaaa fghij // abcde fghij abcde fghij
/*
abcde
fghij
*/
aaaaa fghij /* abcde fghij */
----------------------------------------------------
(考えた方法)
----------------------------------------------------
$st = "#START#";
$ed = "#END#";
s/\b(abcde)\b/${st}$1${ed}/sg;
s/(\/\*.*?)${st}(.*?)${ed}(.*?\*\/)/$1$2$3/sg;
while(s/(\/\/.*?)${st}(.*?)${ed}/$1$2/g){};
s/${st}abcde${ed}/aaaaa/sg;
----------------------------------------------------
ご回答よろしくお願いします。
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 */
素早い回答ありがとうございます!
目からウロコが大量に流れ出ました。このような方法で
コメントアウト中の対象文字列マッチを回避することが出来るのですね!
本質ではありませんが、eオプションを使わずに
3項間演算子を計算させるための配列@{[...]}の使い方に感動しました。
No.1
- 回答日時:
ちょっと考えなきゃならないことがあって, 例えば
/*
* abcde // */
abcde
*/
とあったときにどうなっているとうれしいんでしょうか?
この回答への補足
ご回答ありがとうございます。
これは・・・
複数行コメント内にある//は、
コメントアウトとして機能しない。
として処理してほしいです。
逆に以下のような場合は(文法誤りですが)、
1行コメント優先で処理をしてほしいです。
// /*
abcde
*/
ただ、前提として
・プログラムが文法的に正しいこと
を追加させて下さい。
つまりご提示されたケースは対象外とさせて下さい。
#強制実行したら2番目のabcdeが置換対象になると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ( , )をタブに置換したい。
-
文字の列を揃えるには
-
カンマを改行に変換する方法
-
word 改行マークを印刷時に表示...
-
エクセル重複削除で綺麗に削除...
-
【MS Office Word 2007】文章の...
-
エクセルの『検索と置換ボック...
-
Excelで全角ハイフンを半角ハイ...
-
秀丸で余分なスペースを削除したい
-
文字列に含まれているダブルク...
-
Excelで特定の文字以下を削除し...
-
Word:差し込み印刷時に文字列...
-
複数のスペースを1つのタブに...
-
秀丸で左に幅寄せする方法
-
Wordの置換方法について
-
Wordで括弧を残し、その内側の...
-
数学 記号 sgn
-
エクセル 英数字の後のハイフ...
-
エクセルの「置換」で1行の部分...
-
Word2010で小数点の検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマを改行に変換する方法
-
カンマ( , )をタブに置換したい。
-
Excelで全角ハイフンを半角ハイ...
-
エクセルの『検索と置換ボック...
-
秀丸で余分なスペースを削除したい
-
Word:差し込み印刷時に文字列...
-
【MS Office Word 2007】文章の...
-
文字の列を揃えるには
-
エクセル重複削除で綺麗に削除...
-
エクセル 置換又は関数でかっこ...
-
複数のスペースを1つのタブに...
-
セルの文字列後ろのスペース削除
-
文字列に含まれているダブルク...
-
エクセルの「置換」で1行の部分...
-
word 改行マークを印刷時に表示...
-
1文字だけ置換したい
-
ワードで複数の文字を一括・連...
-
エクセルで濁点カナの変換方法...
-
CSVファイルの任意の列をダブル...
-
Word VBA フッターでの文字の置換
おすすめ情報