以下是一个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)
``
使用C++正则表达式分割C语言函数原型中的参数其中参数可能是函数类型

原文地址: https://www.cveoy.top/t/topic/dn8y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录