C++ 用于类python函数参数解析的Regexp
我试图设计一个regexp,该regexp将以非常简化的类似Python的语法匹配并给出函数名和所有参数,如下所示:C++ 用于类python函数参数解析的Regexp,c++,regex,C++,Regex,我试图设计一个regexp,该regexp将以非常简化的类似Python的语法匹配并给出函数名和所有参数,如下所示: mycall(x, y, hello) 取得了预期的结果: 函数名:mycall 参数0:x 参数1:y 参数2:hello 当然,它还应该匹配noparams(),以及任意数量的参数。至于我的简化,我只需要参数名,不允许使用默认参数或与逗号分隔名称列表不同的名称 我尝试使用“(\\s*)([A-Za-z0-9\])+\\(\\)”的变体仅将函数名字符串与开头的空格匹配失败
mycall(x, y, hello)
取得了预期的结果:
- 函数名:
mycall
- 参数0:
x
- 参数1:
y
- 参数2:
hello
noparams()
,以及任意数量的参数。至于我的简化,我只需要参数名,不允许使用默认参数或与逗号分隔名称列表不同的名称
我尝试使用“(\\s*)([A-Za-z0-9\])+\\(\\)”
的变体仅将函数名字符串与开头的空格匹配失败,代码如下:
std::regex fnregexp(s);
std::smatch pieces_match;
if (std::regex_match(q, pieces_match, fnregexp))
{
std::cout << ">>>> '" << q << "'" << std::endl;
for (size_t i = 0; i < pieces_match.size(); ++i)
{
std::ssub_match sub_match = pieces_match[i];
std::string piece = sub_match.str();
std::cout << " submatch " << i << ": '" << piece << "'" << std::endl;
}
}
使用这种非常基本的语法,是否可以找到函数名及其参数
干杯 将简单函数声明与正则表达式匹配是可行的。对于更复杂的事情,使用真正的解析器(如Boost Spirit)是完全正确的 您问题中的错误是正则表达式中的一个错误结束参数。比较:
"(\\s*)([A-Za-z0-9_])+\\(\\)" // yours
"(\\s*)([A-Za-z0-9_]+)\\(\\)" // correct
您版本中的捕获组仅捕获单个字符。由于正则表达式引擎的工作方式,它是最后一个匹配的引擎:o。正确的版本包括组中的+并按预期捕获hello。可以将简单函数声明与正则表达式匹配。对于更复杂的事情,使用真正的解析器(如Boost Spirit)是完全正确的 您问题中的错误是正则表达式中的一个错误结束参数。比较:
"(\\s*)([A-Za-z0-9_])+\\(\\)" // yours
"(\\s*)([A-Za-z0-9_]+)\\(\\)" // correct
您版本中的捕获组仅捕获单个字符。由于正则表达式引擎的工作方式,它是最后一个匹配的引擎:o。正确的版本包括组中的+并按预期捕获hello。将其用于一致性检查:
^\\s*[A-Za-z_]\\w* *\\( *(?:[A-Za-z_]\\w* *(?:, *[A-Za-z_]\\w* *)*)?\\)$
如果可以的话,用这个来提取签名的部分:
\\w+
第一个子匹配是函数名,其他子匹配是参数
编辑:Python的正确synthax是
[A-Za-z_u2;][A-Za-z0-9_2;]*
将此用于一致性检查:
^\\s*[A-Za-z_]\\w* *\\( *(?:[A-Za-z_]\\w* *(?:, *[A-Za-z_]\\w* *)*)?\\)$
如果可以的话,用这个来提取签名的部分:
\\w+
第一个子匹配是函数名,其他子匹配是参数
编辑:Python的正确synthax是
[A-Za-z_zu;][A-Za-z0-9_zu;]*
不确定要解析什么:Python中的函数声明,如def foo(param):
,或对该函数的调用?匹配类似Python的函数头的字符串,我还可以省略def
。您的输入可以包含多个函数吗?不,只有一个函数,现在没有什么特别的功能(对于复杂的事情,我可能会使用Boost Spirit)。如果函数没有噪音,您可以使用的最简单的正则表达式是\w+
。第一个匹配项是函数名,每个匹配项都是参数不确定要解析什么:Python中的函数声明,如def foo(param):
,或对该函数的调用?一个与类似Python的函数头匹配的字符串,我也可以省略def
。您的输入是否可以包含多个函数?否,只有一个函数,现在没什么特别的(对于复杂的事情,我可能会使用Boost Spirit)。如果函数没有杂音,那么可以使用的最简单的正则表达式是\w+
。第一个匹配项是函数名,另一个匹配项是参数。您可以删除lookahead,它也会这样做;)编辑:哦,你刚刚做了^^是的,因为最初的答案没有提供第一个检查,所以我认为其他类型的检查是必要的。你可以删除前瞻,它也会这样做;)编辑:哦,你刚刚做了^^是的,因为最初的答案没有提供第一次检查,所以我认为其他类型的检查是必要的。