2011-06-20 100 views
1

我的文字像這樣:Perl的正則表達式中刪除C註釋與特定關鍵字

  1. /*等等等等等等等等*/
  2. /*等等等等JJJ等等等等*/
  3. /*等等等等*/
  4. /*等等JJJ
  5. 等等等等*/
  6. /*等等等等*/

我想使用perl正則表達式來刪除以/ *開頭的部分,包含jjj並以*/ 結尾(刪除包含特定關鍵字的c註釋...) 在上面的示例中,我只想要行2,4和5被刪除

你的幫助是最欣賞的,

傑克

+2

當心拐角情況:'//單/ *線comment'或:'字符* STR = 「串/ *字面值」;' –

+1

[文件::評論::插件:: C]( http://p3rl.org/File::Comments::Plugin::C)[String :: Comments :: Extract](http://p3rl.org/String::Comments::Extract)[Regexp :: Common ::評論](http://p3rl.org/Regexp::Common::評論) – daxim

回答

4

一般來說,這是不是很可能。由於評論,延續線等原因,C語法分析非常複雜,因此需要特殊處理。

但是,如果您有足夠簡單的情況,則可以這樣做。因爲你沒有提到它,所以我留下了「// blah jjj」評論處理。

while ($ccode =~ s/(.*?)(\/\*.*?\*\/)//s) 
{ 
    $out .= $1; 
    my $comment = $2; 
    $out .= $comment unless ($comment =~ /\bjjj\b/); 
} 
$out .= $ccode; 
+0

更難處理的更復雜案例的一些例子:包含「/ *」或「* /」的字符串文字;取決於你如何解析它,多行評論;註釋代碼_after_ them:'int/*這是一個整數jjj */j = 2;'(可修改正則表達式來處理它);關鍵字在註釋的開頭或結尾不加空格:'/ * jjj blah * /''/ * blah jjj * /'(可以修改正則表達式/邏輯來處理它,但它開始變得複雜) , 等等。您需要一個合適的C詞法分析器來正確處理有效C代碼中的所有情況。 –

+0

我同意你的陳述,你需要一個合適的C語言分析器來正確地完成工作,畢竟我說過。不處理包含註釋的字符串文字是一個很好的例子。但是,它確實處理了代碼中嵌入的註釋和沒有空格的註釋(雖然jjj檢測可能不會 - 我會更新它)。 –

+0

對。我並沒有把你的解決方案分開,而是說明你的觀點,即一般而言,簡單的做法是不可能的。任何簡單的解決方案都會有幾個失敗點。有些東西可以通過改變邏輯/正則表達式來解決,但是修復得越多,它就越複雜,直到你在無法辨別的正則表達式中游泳,這幾乎是不可能調試的。 –