这是我的代码
#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
答案 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);
};