假設我有這樣的文字:
cat file
/* comment */ not a comment /* another comment */
/* delete this *
/* multiline *
/* comment */
/*************
/* and this *
/************/
The End
我可以使用perl帶條件的? : 只洗掉多行注釋:
perl -0777 -pE 's/(\/\*(?:\*(?!\/)|[^*])*\*\/)/($1=~qr"\R") ? "" : $1/eg;' file
印刷:
/* comment */ not a comment /* another comment */
The End
無條件:
perl -0777 -pE 's/(\/\*(?:\*(?!\/)|[^*])*\*\/)//g;' file
not a comment
The End
有沒有辦法只洗掉帶有正則運算式的多行 C 樣式注釋?即,不在替換中使用 perl 條件代碼?
uj5u.com熱心網友回復:
您可以使用
perl -0777 -pe 's~/\*(?:(?!\*/|/\*).)*\R(?s).*?\*/~~g' file
模式匹配
/\*- 一個/*字串(?:(?!\*/|/\*).)*- 除換行符以外的零個或多個字符,每個字符都不是 a*/和/*char 序列的起始字符\R- 換行序列(?s)- 現在,.也將匹配換行符.*?- 盡可能少的零個或多個字符\*/- 一個*/子串。
請參閱正則運算式演示。
uj5u.com熱心網友回復:
使用 SKIP/FAIL 方法:
perl -0777 -pe's~/\*\N*?\*/(*SKIP)^|/\*.*?\*/~~gs' file
演示
\N匹配所有不是換行符
的點匹配所有字符,包括換行符,因為使用了 s 標志。
第一個分支匹配“行內”注釋,并被迫失敗^(比寫入短(*F)或(*FAIL)相同的結果)。該(*SKIP)回溯控制動詞力量不重試先前的立場,所以關閉的位置之后的下一個嘗試開始*/。
第二個分支匹配剩余的多行注釋。
一個較短的變體,具有相同的兩個分支,但這次\K用于從匹配結果中排除消耗的字符:
perl -0777 -pe's~/\*\N*?\*/\K|/\*.*?\*/~~gs' file
演示
這次第一個分支成功了,但由于之前的所有字符\K都從匹配結果中洗掉,剩下的空字串被替換為空字串。
這兩個搜索/替換與更便攜的沒有太大區別:
s~(/\*.*?\*/)|/\*[\s\S]*?\*/~$1~g
但用更少的努力(不需要捕獲組,空替換字串)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391012.html
