
コメントアウト以外を置換対象とする正規表現について質問です。
以下の(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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- UNIX・Linux JSLinuxについて。 Linuxのこの手順のプログラミングは合っているでしょうか。 ①ホームディ 2 2022/06/20 15:33
- その他(プログラミング・Web制作) awkの正規表現での最左最短マッチング 3 2022/07/01 00:10
- PHP phpの imap_search で漢字コード 1 2022/09/06 17:32
- 高校 順列、組み合わせの宿題を教えていただきたいです。 ABCDEの5人を2人グループに分けます ①Aが3 4 2023/02/24 14:16
- その他(ソフトウェア) ソースネクストアプリをインストールし、製品登録で半角英数字が入力できない 5 2022/07/03 22:44
- PHP substrの使い方について教えて下さい。 4 2023/02/17 15:59
- 数学 正五角形の頂点を反時計回りにabcdeとする。二つの動点r、wが、rは頂点aを、w頂点cを出発して次 3 2022/07/22 11:40
- 数学 中3 円周角の定理の問題です 3 2022/06/29 22:21
- 会社経営 不当な人事評価 5 2022/07/24 11:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマを改行に変換する方法
-
カンマ( , )をタブに置換したい。
-
秀丸で余分なスペースを削除したい
-
文字列に含まれているダブルク...
-
文字の列を揃えるには
-
Excelで全角ハイフンを半角ハイ...
-
エクセルの文字・数字の前後の...
-
エクセル重複削除で綺麗に削除...
-
エクセルの『検索と置換ボック...
-
[Access2000] Replace関数がない?
-
Excel : テキストボックス中の...
-
エクセル 置換又は関数でかっこ...
-
エクセルで濁点カナの変換方法...
-
Word VBA フッターでの文字の置換
-
【MS Office Word 2007】文章の...
-
セルの文字列後ろのスペース削除
-
Word2010特定の名前を置き換え...
-
1文字だけ置換したい
-
Wordでスペースを含む文字を置...
-
ダブルクォーテーションカンマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマを改行に変換する方法
-
カンマ( , )をタブに置換したい。
-
CSVファイルの任意の列をダブル...
-
文字列に含まれているダブルク...
-
秀丸で余分なスペースを削除したい
-
エクセル重複削除で綺麗に削除...
-
エクセルの『検索と置換ボック...
-
Excelで全角ハイフンを半角ハイ...
-
Word:差し込み印刷時に文字列...
-
文字の列を揃えるには
-
word 改行マークを印刷時に表示...
-
セルの文字列後ろのスペース削除
-
エクセルでコンマとピリオドを...
-
エクセルの「置換」で1行の部分...
-
テキストでタブを検索してスペ...
-
桐の項目名の変数利用(一括処理)
-
1文字だけ置換したい
-
エクセルで濁点カナの変換方法...
-
ワード (word ) 日本語の文字...
-
複数のスペースを1つのタブに...
おすすめ情報