使用 C++ 正则表达式查找第一个匹配项的索引
Find index of first match using C++ regex
我正在尝试使用正则表达式在 C++ 中编写拆分函数。到目前为止,我已经想到了这个;
vector<string> split(string s, regex r)
{
vector<string> splits;
while (regex_search(s, r))
{
int split_on = // index of regex match
splits.push_back(s.substr(0, split_on));
s = s.substr(split_on + 1);
}
splits.push_back(s);
return splits;
}
我想知道的是如何填写注释行
您只需要一点点,但请参阅下面代码中的注释。男人的技巧是使用匹配对象,这里 std::smatch
因为你在 std::string
上匹配,以记住你匹配的位置(不仅仅是 那 你做了):
vector<string> split(string s, regex r)
{
vector<string> splits;
smatch m; // <-- need a match object
while (regex_search(s, m, r)) // <-- use it here to get the match
{
int split_on = m.position(); // <-- use the match position
splits.push_back(s.substr(0, split_on));
s = s.substr(split_on + m.length()); // <-- also, skip the whole match
}
if(!s.empty()) {
splits.push_back(s); // and there may be one last token at the end
}
return splits;
}
可以这样使用:
auto v = split("foo1bar2baz345qux", std::regex("[0-9]+"));
并且会给你 "foo", "bar", "baz", "qux"
.
std::smatch
是 std::match_results
的特化,存在参考文档 here。
我正在尝试使用正则表达式在 C++ 中编写拆分函数。到目前为止,我已经想到了这个;
vector<string> split(string s, regex r)
{
vector<string> splits;
while (regex_search(s, r))
{
int split_on = // index of regex match
splits.push_back(s.substr(0, split_on));
s = s.substr(split_on + 1);
}
splits.push_back(s);
return splits;
}
我想知道的是如何填写注释行
您只需要一点点,但请参阅下面代码中的注释。男人的技巧是使用匹配对象,这里 std::smatch
因为你在 std::string
上匹配,以记住你匹配的位置(不仅仅是 那 你做了):
vector<string> split(string s, regex r)
{
vector<string> splits;
smatch m; // <-- need a match object
while (regex_search(s, m, r)) // <-- use it here to get the match
{
int split_on = m.position(); // <-- use the match position
splits.push_back(s.substr(0, split_on));
s = s.substr(split_on + m.length()); // <-- also, skip the whole match
}
if(!s.empty()) {
splits.push_back(s); // and there may be one last token at the end
}
return splits;
}
可以这样使用:
auto v = split("foo1bar2baz345qux", std::regex("[0-9]+"));
并且会给你 "foo", "bar", "baz", "qux"
.
std::smatch
是 std::match_results
的特化,存在参考文档 here。