相关疑难解决方法(0)

简单的std :: regex_search()代码不能用Apple clang ++ -std = c ++ 14编译

这是MCVE:

#include <iostream>
#include <regex>

std::string s()
{
    return "test";
}

int main()
{
    static const std::regex regex(R"(\w)");
    std::smatch smatch;

    if (std::regex_search(s(), smatch, regex)) {
        std::cout << smatch[0] << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译很好:

$ clang ++ -std = c ++ 11 main.cpp

但不是:

$ clang ++ -std = c ++ 14 main.cpp

后一种情况下的错误消息(使用-std = c ++ 14):

main.cpp:14:9: error: call to deleted function 'regex_search'
    if (std::regex_search(s(), smatch, regex)) {
        ^~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/regex:5998:1: note: 
      candidate function [with _ST = std::__1::char_traits<char>, …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 clang++ c++14

14
推荐指数
2
解决办法
1897
查看次数

在 istream 上使用 regex_iterator

我希望能够解决这样的问题:Getting std::ifstream to handle LF, CR, and CRLF? 其中 anistream需要通过复杂的分隔符进行标记;这样标记化的唯一方法istream是:

  1. istream一次读取一个字符
  2. 收集角色
  3. 当命中分隔符时,将集合作为标记返回

正则表达式非常擅长用复杂的分隔符标记字符串:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)(?:\n\r?|\r)")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });
Run Code Online (Sandbox Code Playgroud)

但我不能regex_iterator在 a 上使用 a istream:( 我的解决方案是吸食istream然后运行regex_iterator它,但吸食步骤似乎是多余的。

是否存在istream_iterator和 的邪恶组合regex_iterator,或者如果我想要它,我必须自己编写它吗?

c++ regex iterator istream-iterator istream

5
推荐指数
1
解决办法
1776
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

clang++ ×1

istream ×1

istream-iterator ×1

iterator ×1

regex ×1