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
C++ 用于类python函数参数解析的Regexp_C++_Regex - Fatal编程技术网

C++ 用于类python函数参数解析的Regexp

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\])+\\(\\)”的变体仅将函数名字符串与开头的空格匹配失败

我试图设计一个regexp,该regexp将以非常简化的类似Python的语法匹配并给出函数名所有参数,如下所示:

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,它也会这样做;)编辑:哦,你刚刚做了^^是的,因为最初的答案没有提供第一个检查,所以我认为其他类型的检查是必要的。你可以删除前瞻,它也会这样做;)编辑:哦,你刚刚做了^^是的,因为最初的答案没有提供第一次检查,所以我认为其他类型的检查是必要的。