gpt4 book ai didi

C++:用简单的正则表达式解析还是应该使用 sscanf?

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:25 25 4
gpt4 key购买 nike

我需要解析像 func1(arg1, arg2) 这样的字符串; func2(arg3, arg4);.这不是一个非常复杂的解析问题,所以我宁愿避免求助于 flex/bison 或类似的实用程序。

我的第一个方法是尝试使用 POSIX C regcomp/regexec 或 C++ std::regex 的 Boost 实现。我写了下面的正则表达式,它不起作用(我将进一步解释原因)。

 "^"
"[ ;\t\n]*"
"(" // (1) identifier
"[a-zA-Z_][a-zA-Z0-9_]*"
")"
"[ \t\n]*"
"(" // (2) non-marking
"\["
"(" // (3) non-marking
"[ \t]*"
"(" // (4..n-1) argument
"[a-zA-Z0-9_]+"
")"
"[ \t\n]*"
","
")*"
"[ \t\n]*"
"(" // (n) last argument
"[a-zA-Z0-9_]+"
")"
"]"
")?"
"[ \t\n]*"
";"

请注意,组 1 捕获标识符,组 4..n-1 旨在捕获除最后一个参数之外的参数,后者由组 捕获n.

当我将此正则表达式应用于 func(arg1, arg2, arg3) 时,我得到的结果是一个数组 {func, arg2, arg3}。这是错误的,因为 arg1 不在其中!

问题是在标准正则表达式库中,子标记只捕获最后一个匹配项。换句话说,如果您将正则表达式 "((a*|b*))*" 应用于 "babb",则内部匹配的结果将成为 bb 并且之前的所有捕获都将被遗忘。

另一件让我烦恼的事情是,如果出现错误,则无法知道哪个字符未被识别,因为当输入被拒绝时,这些函数提供的有关解析器状态的信息非常少。

所以我不知道我是否遗漏了什么......在这种情况下我应该使用 sscanf 或类似的东西吗?

请注意,我更喜欢使用 C/C++ 标准库(可能还有 boost)。

最佳答案

如果你想使用 Regex,将它分成 2 个步骤会不会更简单。在第 1 步中,您会发现

func1(stuff);

并把它变成func1stuff

在下一步中,您将解析“stuff”以找到该函数的所有单独参数。

关于C++:用简单的正则表达式解析还是应该使用 sscanf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com