【问题标题】:Parse numbers by dot with std::regex [duplicate]使用 std::regex 按点解析数字 [重复]
【发布时间】:2017-05-08 10:34:25
【问题描述】:

我正在尝试解析用点分隔的数字并将每个数字作为单独的字符串。那是我的示例程序:

#include <iostream>
#include <string>
#include <regex>

int main(int argc, char* argv[])
{
    try
    {
        std::string data("123.321.456.654");
        std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))");
        std::smatch m;
        if (std::regex_match(data, m, reg))
        {
            std::cout << m.size() << std::endl;
            //std::cout << m[0].str() << std::endl;
            std::cout << m[1].str() << std::endl;
            std::cout << m[2].str() << std::endl;
            std::cout << m[3].str() << std::endl;
            std::cout << m[4].str() << std::endl;
        }
    }
    catch (const std::exception& e)
    {
        std::cerr << "Error occurred: " << e.what() << std::endl;
    }

    return EXIT_SUCCESS;
}

在这个示例中,我使用了三个正则表达式:

作品:

std::regex reg(R"((\d+)\.(\d+)\.(\d+)\.(\d+))");

作品:

std::regex reg(R"(([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+))");

根本不工作:

std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))");

我的问题是为什么最后一个正则表达式不起作用,语法错误在哪里?谢谢。

【问题讨论】:

  • 因为\1 是一个反向引用,所以它不是递归模式的子例程调用。它与第一个捕获组捕获的值匹配。
  • @WiktorStribiżew:答案在答案部分
  • 这不是 C++ 问题,而是正则表达式问题;请养成将问题分解成各个部分的习惯。
  • @WiktorStribiżew 是的,所以第一组是([0-9]+),这应该是正确的。
  • @SpaceRabbit:不,第一个反向引用是“123”。不是[0-9]+。查看我的答案和我链接到的资源。

标签: c++ regex parsing


【解决方案1】:

错误不在您的语法中;这是你的逻辑。

反向引用不重复模式; they match previously-matched text.

因此,您的模式将匹配 123.123.123.123

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多