正则参数解析

Regex parameter parsing

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

function(otherFunction1(parameters1), otherFunction2(parameters2))

我需要输出为:

otherFunction1(parameters1), otherFunction2(parameters2)

我的尝试是这样的:

open(my $DATA, '<', 'txt') or die "...";
while(my $line = <$DATA>){
    $line =~ /\((\w+)\)/;
    my $parameters  = ;

    print "$parameters\n";
}

我刚收到

parameters1

有没有办法使用正则表达式来找到指定字符的第一次和最后一次出现?

谢谢!

您需要递归正则表达式才能正确执行此操作。像这个(带有 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),只是它将参数列表包含在捕获组中。

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

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

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