使用C++正则表达式分割C语言函数原型中的参数其中参数可能是函数类型
以下是一个C++正则表达式示例,可以用于分割C语言函数原型中的参数:
#include <iostream>
#include <regex>
int main() {
std::string input = "int foo(int a, double b, void (*c)(int, double))";
std::regex regex("\\(([^()]|(?R))*\\)");
std::smatch match;
if (std::regex_search(input, match, regex)) {
std::string parameters = match[0].str().substr(1, match[0].str().size() - 2);
std::regex regex2("[^,]+(?=,|\\))");
std::sregex_iterator next(parameters.begin(), parameters.end(), regex2);
std::sregex_iterator end;
while (next != end) {
std::smatch match2 = *next;
std::cout << match2.str() << std::endl;
next++;
}
}
return 0;
}
正则表达式 \\(([^()]|(?R))*\\) 用于匹配一对括号内的内容,其中 [^()] 匹配除了括号以外的字符,(?R) 表示递归引用正则表达式本身,即在括号中可以继续包含括号。这样可以确保正确匹配函数原型中的最外层括号。
然后,我们可以使用 substr() 函数去除最外层括号,并使用正则表达式 [^,]+(?=,|\\)) 匹配每个参数。其中 [^,]+ 匹配除了逗号以外的字符,并且必须至少出现一次,(?=,|\\)) 表示匹配到逗号或者右括号为止。这样可以确保正确匹配参数列表中的每个参数,即使参数中包含函数类型。
示例输出为:
int a
double b
void (*c)(int, double)
``
原文地址: https://www.cveoy.top/t/topic/dn8y 著作权归作者所有。请勿转载和采集!