c++ - 从 Perl 到 C++ 的正则表达式转换

标签 c++ regex pcre

我们有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++ 正确转换正则表达式?

更新: 铿锵版本:

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]*)");

查看实际效果 here .

关于c++ - 从 Perl 到 C++ 的正则表达式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403025/

相关文章:

c++ - PCRE中的匹配顺序

c++ - 传递给线程后保持引用存活

c - compilint PCRE c 代码中体系结构 x86_64 的 undefined symbol

c++ - 具有非常小块的持久映射缓冲区 (glBufferStorage GL_MAP_PERSISTENT_BIT)

javascript - 如何在JS中使用正则表达式

python - 如何使用 Urllib2 更有效地抓取?

regex - 如何从文件或脚本中的管道中选择多行?

R:正则表达式捕获给定字符之后的所有实例

c++ - 掷硬币游戏 : Optimization problem

c++ - 引用 GetCapture() 函数捕获鼠标意味着什么?