Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式参数解析_Regex_Perl_Parsing_Parameters - Fatal编程技术网

Regex 正则表达式参数解析

Regex 正则表达式参数解析,regex,perl,parsing,parameters,Regex,Perl,Parsing,Parameters,我需要解析一个包含函数调用的文件。例如: function(otherFunction1(parameters1), otherFunction2(parameters2)) 我需要输出为: otherFunction1(parameters1), otherFunction2(parameters2) 我的尝试是: open(my $DATA, '<', 'txt') or die "..."; while(my $line = <$DATA>){ $line =

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

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";
}
是否有方法使用regexp查找指定字符的第一个和最后一个匹配项


谢谢

您需要一个递归正则表达式来正确地执行它。与此类似(带有
x
标志):

(?(定义)
(?#函数是:
\w+\s*#一个名称
\((?¶mList)\)\和参数列表
)
(?
(?:
\s*(?&参数)
(?:,\s*(?¶m))*\s*
)* 
)
(?#参数为:
(?&fn)#函数调用
|\w+#或简单值
)
)
\w+\s*\(((?(?¶mList))\)

这是匹配开始括号和结束括号所必需的。只需根据需要扩展语法即可


底部的模式相当于
(?&fn)
,只是它将参数列表包含在捕获组中。

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

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

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

第一个:
/c/
。最后一个
/^.*c/s
(?(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)) \)
$line =~ /\((.*)\)/;
my $parameters = $1;