2014-10-22 53 views
0

我想使用perl和regex查找源文件中函數的所有調用。使用正則表達式和perl查找函數調用

函數調用長相(簡化的)像:

gettrans(ABC,DEF,GHI);

第二個和第三個參數是可選的。所以gettrans(ABC)和gettrans(ABC,DEF)也是有效的。但該功能必須至少具有第一個參數。

我使用以下testfile的檢查我的Perl代碼:

gettrans(ABC); 
gettrans(ABC,D); 
gettrans(ABC,D,E); 
gettrans(A,B,C);  gettrans(D); 
gettrans(ABC,); 
gettrans(,A); 

我目前的Perl代碼如下所示:

#!/usr/bin/perl -w 
my $i = 1; 
while (my $line = <>) { 
    my @res = ($line =~ /gettrans\((\w+)(,\w+){0,2}\)/g); 

    print "line " . $i . ":\n"; 
    foreach (@res) { 
     if (defined($_)) { 
      print $_ . "\n"; 
     } 
    } 
    print "\n"; 
    $i++; 
} 

這給出了以下的輸出:

line 1: 
ABC 

line 2: 
ABC 
,D 

line 3: 
ABC 
,E 

line 4: 
A 
,C 
D 

line 5: 

line 6: 

但是,我期望的輸出或更好,我想要的是類似於:

line 1: 
gettrans(ABC) 

line 2: 
gettrans(ABC,D) 

line 3: 
gettrans(ABC,D,E) 

line 4: 
gettrans(A,B,C) 
gettrans(D) 

line 5: 

line 6: 

此外,什麼是對我來說也很迷惑是,如果我在testfile的,並與一個0(零)正則表達式替換逗號,我一共拿到了不同的輸出,這更接近我想要什麼(除了在這種情況下,我也得到第5行和第6行的輸出[這是無效的函數調用])。

輸出,用於0(零)替換逗號:

line 1: 
ABC 

line 2: 
ABC0D 

line 3: 
ABC0D0E 

line 4: 
A0B0C 
D 

line 5: 
ABC0 

line 6: 
0A 

我剛開始學習這兩種珍珠和正則表達式。很高興得到關於我目前存在的誤解的任何提示。

謝謝大家!

銅, 彼得

+0

關於逗號/零部分:你」重新匹配'\ w +'。 '\ w'等同於'[a-zA-Z0-9_]',所以這些零就像是你的'ABCD'那樣只是字母匹配。 – funkwurm 2014-10-22 07:53:26

回答

1

包裹在paranthesis整個正則表達式作爲

(gettrans\(\w+(,\w){0,2}\);) 

這將匹配函數調用

while (my $line = <>) { 
     $line =~ /(gettrans\(\w+(,\w){0,2}\);)/g 
     print $1 . "\n" 

}

將產生輸出作爲

個在 $line圖案和paranthesis ()內的相匹配的字符串
gettrans(ABC); 
gettrans(ABC,D); 
gettrans(ABC,D,E); 
gettrans(A,B,C);  gettrans(D); 

這裏$line =~ /(gettrans\(\w+(,\w){0,2}\);)/g檢查保存在$1變量,其上打印。

#!/usr/bin/perl -w 
my $i = 1; 
while (my $line = <>) { 
     $line =~ /(gettrans\((\w+)(,\w+){0,2}\))/g; 

     print "line " . $i . ":\n"; 

     print $1."\n"; 
     $i++; 
} 

會產生輸出

line 1: 
gettrans(ABC) 

line 2: 
gettrans(ABC,D) 

line 3: 
gettrans(ABC,D,E) 

line 4: 
gettrans(A,B,C) 
gettrans(D) 

line 5: 

line 6: 
+0

這很簡單,謝謝:) – Peter 2014-10-22 08:00:34

+0

@Peter歡迎:) – nu11p01n73R 2014-10-22 08:03:44

0

下面是我會怎樣構建你的正則表達式。

注意,該行號的變量$.可以顯示文件句柄的當前行號最後一次讀取:

use strict; 
use warnings; 

while (<DATA>) { 
    if (my @results = /gettrans\(\w+(?:,\w+){0,2}\)/g) { 
     print "line $.:\n"; 
     print "$_\n" for @results; 
     print "\n"; 
    } 
} 

__DATA__ 
gettrans(ABC); 
gettrans(ABC,D); 
gettrans(ABC,D,E); 
gettrans(A,B,C);  gettrans(D); 
gettrans(ABC,); 
gettrans(,A); 

輸出:

line 1: 
gettrans(ABC) 

line 2: 
gettrans(ABC,D) 

line 3: 
gettrans(ABC,D,E) 

line 4: 
gettrans(A,B,C) 
gettrans(D)