使用std :: smatch作为返回类型将导致匹配器变为“ \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000”

时间:2018-08-06 14:13:47

标签: c++ regex c++11

这是我的代码

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

std::smatch match(std::string s, std::string re_s) {
    std::regex re(re_s);
    std::smatch what;
    if (std::regex_search(s, what, re)) {
        std::string s2 = what[0];
        return what;
    }
}

int main(int argc, char **argv) {
    std::string s = "Ro.Unity [~/Dropbox/cs/Ro.Unity] - .../Assets/Script/Ro/UI/H.cs - JetBrains Rider";
    std::smatch m = match(s, "\\S+");
    std::string s2 = m[0];
    std::cout << s2 << std::endl;
    return (0);
};

s2是“ \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000”,如何使用“ Ro.Unity”制作s2

在我的CMakeCache.txt中,cxx编译器为:

//CXX compiler
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-5

2 个答案:

答案 0 :(得分:3)

std::smatch保存字符串的迭代器,而不复制字符串内容。 (当将std::smatch的元素隐式转换为std::string时进行复制。)由于match通过值接受其参数,因此其参数的生存期在函数调用结束时结束表达式,使std::smatch持有的迭代器变成悬空的迭代器。

一种解决方案是让match通过引用接受s;也就是说,将std::smatch match(std::string s, std::string re_s)更改为std::smatch match(std::string& s, std::string re_s)

答案 1 :(得分:0)

我从@cpplearner答案中得到启发,返回std :: smatch会导致此错误,但是在#match代码块中smatch正常工作,因此我可以在#match代码块中获得预期值并返回非匹配类型(这种类型包括我需要的smatch值),以下是我的代码,我只能返回类型为std :: vector的组

#include <iostream>
#include "string"
#include "regex"
#include "vector"

std::vector<std::string> match(std::string s, std::string re_s) {
    std::regex re(re_s);
    std::smatch matches;
    std::vector<std::string> matches2;
    if (std::regex_search(s, matches, re)) {
        for (std::string match : matches) {
            matches2.push_back(match);
        }
    }
    return matches2;
}

int main(int argc, char **argv) {
    auto m = match("prpr8941", "[a-z]+(\\d+)");
    std::cout << m[1] << std::endl;
    return (0);
};