从perl到C++的Regexp转换

Regexp conversion from perl to C++

本文关键字:Regexp 转换 C++ perl      更新时间:2023-10-16

我们有下面的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]*");

如果我们天真地将regexp转换为[+-]?[d(x)]*[^d]*,那么当然会留下无限循环。

如何正确地将regexp转换为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

问题是d试图被解释为转义序列,因此您必须对反斜杠进行转义,如\d中所示。

另一种选择是使用原始字符串文字,如:

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

请在此处查看它的实际操作。