【问题标题】:Regexp conversion from perl to C++从 perl 到 C++ 的正则表达式转换
【发布时间】:2015-12-21 19:32:20
【问题描述】:

我们有 following regexp 用于解析像 5x+10x^3-10x^2 这样的方程:

[+-]?[\d(x)]*[\^\d]*

c++ 中的以下代码,取自示例并针对任务进行了修改,导致无限循环:

std::regex words_regex("[+-]?[\d(x)]*[\^\d]*");
auto words_begin = 
            std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator();

for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
    std::smatch match = *i;                                                 
    std::string match_str = match.str(); 
    std::cout << match_str << '\n';
}

它还在编译时抛出警告:

1.cpp:21:35: warning: unknown escape sequence '\d' [-Wunknown-escape-sequence]
    std::regex words_regex("[+-]?[\d(x)]*[\^\d]*");
                                  ^~
1.cpp:21:43: warning: unknown escape sequence '\^' [-Wunknown-escape-sequence]
    std::regex words_regex("[+-]?[\d(x)]*[\^\d]*");
                                          ^~
1.cpp:21:45: warning: unknown escape sequence '\d' [-Wunknown-escape-sequence]
    std::regex words_regex("[+-]?[\d(x)]*[\^\d]*");

如果我们天真地将正则表达式转换为[+-]?[d(x)]*[^d]* - 当然会出现无限循环。

如何正确转换c++ 的正则表达式?

UPD: Clang 版本:

Mac:concurrent macbook$ clang++ -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

【问题讨论】:

    标签: c++ regex pcre


    【解决方案1】:

    问题在于 \d 正被尝试解释为转义序列,因此您必须转义反斜杠,如 \\d 中一样。

    另一种方法是使用原始字符串文字,如:

    std::regex words_regex(R"([+-]?[\d(x)]*[\^\d]*)");
    

    看到它在行动here

    【讨论】:

    • 看起来像一个答案,但在从行动中采取的例子中,它仍然在无限循环中消失:(
    • 我听不懂你在说什么,你能具体点吗?您能否提供导致无限循环发生的特定代码和输入?我提供了一个综合解决方案的链接,表明它适用于您提供的示例方程输入。
    • 它看起来像我这边的编译器问题。如果我从coliru.stacked-crooked.com/a/7345835846c6f1a3 获取代码 - 它会编译但也会在本地导致无限循环。为问题添加了 clang 版本..
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多