c++ - 使用正则表达式分割特殊字符

标签 c++ c c++11

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/

相关文章:

c - qsort比较字母顺序的字符串

c++ - 如何在自定义类的 map 中使用 emplace?

C++11 交叉编译器/标准库随机分布再现性

c++ - 如何在 C++ 中循环执行再次要求输入的 switch-case 语句?

javascript - 编译在线 html 表单上提交的代码并使用 gcc 处理它的过程

C++ 类内线程并发

c - 一维和二维数组

c++如何创建派生类模板的实例

c - 等同于 AVX 中的 SSE unpacklo_ps/unpackhi_ps(对于 double )

c++ - 可变参数模板类型特征解析