正则表达式参数解析

时间:2015-03-23 17:47:33

标签: regex perl parsing parameters

我需要解析包含函数调用的文件。例如:

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来查找指定字符的第一个和最后一个出现?

谢谢!

2 个答案:

答案 0 :(得分:2)

你需要一个递归的正则表达式才能正确地完成它。像这样(带有x标志):

(?(DEFINE)
  (?<fn>                 # a function is:
    \w+ \s*              # a name
    \( (?&paramList) \)  # and a parameter list
  )

  (?<paramList>
    (?:
      \s* (?&param)
      (?: , \s* (?&param) )* \s*
    )* 
  )

  (?<param>   # a parameter is:
    (?&fn)    # a function call
    | \w+     # or a simple value
  )
)

\w+ \s* \( (?<extractedParameters>(?&paramList)) \)

Demo

这需要匹配左括号和右括号。只需根据需要扩展语法。

底部的模式等同于(?&fn),除了它将参数列表包含在捕获组中。

答案 1 :(得分:0)

你几乎拥有它。你确实想要每一行的第一个和最后一个括号之间的所有内容,对吗?除非要解析的行比您的示例更复杂,否则代码中的这一小改变可能就是您所需要的。

$line =~ /\((.*)\)/;
my $parameters = $1;

您的\w+将停止匹配字符串中的第一个非单词字符。在您的示例中,这是第一个右侧括号。