【问题标题】:Match function definition using regex使用正则表达式匹配函数定义
【发布时间】:2018-08-04 11:52:32
【问题描述】:

我想匹配一个函数定义。函数定义可以像

int foo () {
    // Some statement
}
int foo(int a, int b){}
int foo ()
{
}

我写了一个正则表达式foo\s*\([\w, ]*\)\s*{ 并在原子文本编辑器中尝试过,它运行良好。但是当我尝试在 C++14 编译器中运行它时,它给了我 regex_error()。我的 C++ 正则表达式是regex b("foo\s*\([\w, ]*\)\s*{");。我也尝试过将括号双重转义为\\(,但仍然无法正常工作。

【问题讨论】:

标签: c++ regex c++11 c++14


【解决方案1】:

您的正则表达式包含未转义的 { 字符,这在您在 regex101.com 测试的 PCRE 正则表达式中很好,但 std::regex 默认正则表达式引擎不允许未转义的 { 应该匹配文字 {字符。

此外,最好使用原始字符串文字来定义正则表达式模式,因为正则表达式转义序列中的反斜杠不需要转义。

因此,您可以将当前的正则表达式修复为

regex b(R"(foo\s*\([\w, ]*\)\s*\{)");

或者,您可以修改模式以匹配所有从foo( 到最后一个){,方法是将[\w, ]* 替换为贪心点模式.*

regex b(R"(foo\s*\(.*\)\s*\{)");

查看C++ demo

regex r(R"(foo\s*\([\w, ]*\)\s*\{)");
string s("int foo () {\n    // Some statement\n}\nint foo(int a, int b){}\nint foo ()\n{\n}");
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
                         i != std::sregex_iterator();
                         ++i)
{
    std::smatch m = *i;
    std::cout <<  m.str() << '\n';
}

输出:

foo () {
foo(int a, int b){
foo ()
{

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多