string MyName = " 'hi, load1', 'hi, load2', varthatnotstring ";
我想使用正则表达式在每个 ,
处分割上面的字符串,同时保留引号内的字符串。
因此, split MyName
应该产生:
1: 'hi, load1'
2: 'hi, load2'
3: varthatnotstring
我目前使用regex MyR("(.<em>),(.</em>),(.*)");
,但这给了我:
1: 'hi
2: load1'
3: 'hi
4: load2'
<小时/>
- 我应该使用什么正则表达式?
最佳答案
根据您想要如何处理某些极端情况,您可以使用以下内容:
std::regex reg(R"--((('.*?')|[^,])+)--");
一步一步:
R"--(...)--"
是原始字符串文字的语法,因此我们不必担心转义。我们在这里不需要它,但我默认将它们用于正则表达式字符串。('.*?')
两个撇号之间(包括)的所有字符(非贪婪)[^,]
任何不是逗号的内容(('.*?')|[^,])+
非,
字符或'...'< 的任意序列
-序列。
(注意:('.*?')
部分必须放在第一位)
所以这也将匹配,例如tkasd 'rtzrze,123'
作为单个匹配。它也不会删除任何空格。
用法:
std::regex reg(R"--((('.*?')|[^,])+)--");
std::string s = ",,t '123,4565',k ,'rt',t,z";
for (std::sregex_iterator rit(s.begin(), s.end(), reg), end{}; rit != end; ++rit) {
std::cout << rit->str() << std::endl;
}
输出:
t '123,4565'
k
'rt'
t
z
编辑:
我很少使用正则表达式,因此欢迎任何有关可能的改进或陷阱的评论。也许使用regex_token_iterator
还有一个更好的解决方案。
关于c++ - 使用正则表达式分割特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298479/