我需要解析包含函数调用的文件。例如:
function(otherFunction1(parameters1), otherFunction2(parameters2))
我需要输出:
otherFunction1(parameters1), otherFunction2(parameters2)
我的尝试是这样的:
open(my $DATA, '<', 'txt') or die "...";
while(my $line = <$DATA>){
$line =~ /\((\w+)\)/;
my $parameters = $1;
print "$parameters\n";
}
我刚刚开始
parameters1
有没有办法使用regexp来查找指定字符的第一个和最后一个出现?
谢谢!
答案 0 :(得分:2)
你需要一个递归的正则表达式才能正确地完成它。像这样(带有x
标志):
(?(DEFINE)
(?<fn> # a function is:
\w+ \s* # a name
\( (?¶mList) \) # and a parameter list
)
(?<paramList>
(?:
\s* (?¶m)
(?: , \s* (?¶m) )* \s*
)*
)
(?<param> # a parameter is:
(?&fn) # a function call
| \w+ # or a simple value
)
)
\w+ \s* \( (?<extractedParameters>(?¶mList)) \)
这需要匹配左括号和右括号。只需根据需要扩展语法。
底部的模式等同于(?&fn)
,除了它将参数列表包含在捕获组中。
答案 1 :(得分:0)
你几乎拥有它。你确实想要每一行的第一个和最后一个括号之间的所有内容,对吗?除非要解析的行比您的示例更复杂,否则代码中的这一小改变可能就是您所需要的。
$line =~ /\((.*)\)/;
my $parameters = $1;
您的\w+
将停止匹配字符串中的第一个非单词字符。在您的示例中,这是第一个右侧括号。