-
C++正则表达式怎么匹配多个子串
问题
现有字符串 s = "ID={0:2d}, Name={1}, Folder = {3}{4}, Time: {2} ms.";,现在需要把花括号中的内容提出来,即返回结果为多个字符串 "0:2d", "1", "3", "4", "2",如何写代码最容易实现?
回答
使用正则表达式,使用模式为:"\\{(.+?)\\}",这里需要注意几点:
花括号需要两个双斜杠进行转义。
加上小括号的内容可以单独提取
在C++中,使用 sregex_iterator 类进行提取,在返回的结果中 pos->str(n) 可以取得以下数据:
n=0: 整个匹配字符串
n>0: 按顺序取得括号中的内容
以下具体实现:
#include <iostream>
#include <string>
#include <regex>
#include <vector>
using namespace std;
vector<string> regTest(string s, string pattern){
auto res = vector<string>();
regex r(pattern);
sregex_iterator pos(s.cbegin(), s.cend(), r), end;
for(; pos!=end; ++pos)
res.push_back(pos->str(1));
return res;
}
int main() {
string input = "ID={0:2d}, Name={1}, Folder = {3}{4}, Time: {2} ms.";
string pattern = "\\{(.+?)\\}";
for(auto s: regTest(s, pattern))
cout<<s<<", ";
}
输出为:
0:2d, 1, 3, 4, 2,
问题解决。
现有字符串 s = "ID={0:2d}, Name={1}, Folder = {3}{4}, Time: {2} ms.";,现在需要把花括号中的内容提出来,即返回结果为多个字符串 "0:2d", "1", "3", "4", "2",如何写代码最容易实现?
回答
使用正则表达式,使用模式为:"\\{(.+?)\\}",这里需要注意几点:
花括号需要两个双斜杠进行转义。
加上小括号的内容可以单独提取
在C++中,使用 sregex_iterator 类进行提取,在返回的结果中 pos->str(n) 可以取得以下数据:
n=0: 整个匹配字符串
n>0: 按顺序取得括号中的内容
以下具体实现:
#include <iostream>
#include <string>
#include <regex>
#include <vector>
using namespace std;
vector<string> regTest(string s, string pattern){
auto res = vector<string>();
regex r(pattern);
sregex_iterator pos(s.cbegin(), s.cend(), r), end;
for(; pos!=end; ++pos)
res.push_back(pos->str(1));
return res;
}
int main() {
string input = "ID={0:2d}, Name={1}, Folder = {3}{4}, Time: {2} ms.";
string pattern = "\\{(.+?)\\}";
for(auto s: regTest(s, pattern))
cout<<s<<", ";
}
输出为:
0:2d, 1, 3, 4, 2,
问题解决。