关于c++ 正则表达式regex的一些问题
std::vector<std::string> split(const std::string& str, const std::string& regex_str)
{
std::regex re(regex_str);
return { std::sregex_token_iterator(str.begin(), str.end(), re, -1), std::sregex_token_iterator() };
}
int main() {
std::string a = "hello world c++ shen jie";
std::string re = " ";
auto b = split(a, re);
for (auto& i : b) {
std::cout << i << std::endl;
}
return 0;
}
/*
//答案
hello
world
c++
shen
jie
*/
以上代码可以正常运行,但是我想要一种更加简化且美观的写法,比如:
把开始的 std::regex re(regex_str);
加到return 那一行中
比如:
std::vector<std::string> split(const std::string& str, const std::string& regex_str)
{ // a yet more concise form!
return { std::sregex_token_iterator(str.begin(), str.end(), std::regex(regex_str), -1), std::sregex_token_iterator() };
}
但是会报错
或者使用lambda表达式
std::vector<std::string> split(const std::string& str, const std::string& regex_str)
{
return { std::sregex_token_iterator(str.begin(), str.end(), [regex_str]()->std::regex{
std::regex re(regex_str);
return re;},
-1),
std::sregex_token_iterator()};
}
但是也是会报错,我该怎么写呢
报错应该是没得改了,看这个类的实现,这个类的构造函数第三个参数的类型为右值(std::regex(regex_str)
)的函数都删除了,构造不了也就报错了,你现在这种写法才是标准的
regex_token_iterator(_BidIt, _BidIt,
const regex_type&&, int = 0,
regex_constants::match_flag_type =
regex_constants::match_default) = delete;
regex_token_iterator(_BidIt, _BidIt,
const regex_type&&, const vector<int>&,
regex_constants::match_flag_type =
regex_constants::match_default) = delete;
template<size_t _Nx>
regex_token_iterator(_BidIt, _BidIt,
const regex_type&&,
const int (&)[_Nx],
regex_constants::match_flag_type =
regex_constants::match_default) = delete;
regex_token_iterator(_BidIt, _BidIt,
const regex_type&&,
_XSTD initializer_list<int>,
regex_constants::match_flag_type =
regex_constants::match_default) = delete;