2014-04-23 127 views
3

我想寫過濾掉註釋(#)符號後/刪除一切選擇,但在下面的例子所以忽略#符號的字符串中(「」或「」)Perl的正則表達式:我如何結合這2個正則表達式?

只有最後一行會被過濾/刪除

"#dummy comment" asd asd 
' abC# dummy comment' 
abC#real comment 

這是兩個正則表達式選擇我想出迄今(我會添加了S /標籤以後):

/('|").*#.*('|")/g  --> selects fake commnts 

/#(?!!).+/g ---> highlights all comments, including above ones (?!! is to ignore #!/usr/bin/env perl) 

我目前正在努力進入這兩點意見可以達到上述結果噸。我曾嘗試使用正向和反向查找,但似乎無法得到這個權利。任何建議都將不勝感激。

+5

如果你希望編寫一個能夠從Perl代碼中刪除註釋的程序,那麼我認爲你正在浪費你的時間。你必須考慮諸如'$ string =〜s#//#/#g'和'爲我的$ i(0 .. $#array){...}'之類的東西,可能還有其他幾個人 – Borodin

+1

如果你希望編寫一個將從Perl代碼中刪除註釋的程序,該程序已被寫入。使用['PPI'](http://metacpan.org/pod/PPI)。 – mob

+0

不知道爲什麼它被擱置,問題主要是關於加入2個陳述,而不僅僅是刪除評論。 – L457

回答

2

這個簡單的方法呢?

  1. 移除第一
  2. 雙或單引號之間的所有子串通過簡單的正則表達式cpature

這裏提取出#後子是測試程序爲您的樣品輸入:

#!/usr/bin/perl 

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    s/['"][^'"]*['"]//g; 
    if (m/#(.*)/) { 
     print "$1\n"; 
    } 
} 

__DATA__ 
"#dummy comment" asd asd 
' abC# dummy comment' 
abC#real comment 
+0

對不起,聽起來像一個noob,但說如果我已經有我的數據存儲在一個單一的變量/字符串$ str而不是數據文件,我將如何使用上述while循環然後。我自己嘗試過,但得到了無限循環。謝謝:D – L457

+0

@SimpsonDanny然後你可以使用'$ str =〜s/['「] [^'」] * ['「] // g;打印」$ 1 \ n「如果$ str =〜m /#(.*)/;' –

+0

謝謝,我想即時標題在正確的方向。 – L457