我想使用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
我剛開始學習這兩種珍珠和正則表達式。很高興得到關於我目前存在的誤解的任何提示。
謝謝大家!
銅, 彼得
關於逗號/零部分:你」重新匹配'\ w +'。 '\ w'等同於'[a-zA-Z0-9_]',所以這些零就像是你的'ABCD'那樣只是字母匹配。 – funkwurm 2014-10-22 07:53:26