使用正则表达式拆分特殊字符

Using regex to split special char

本文关键字:特殊字符 拆分 正则表达式      更新时间:2023-10-16
string MyName = " 'hi, load1', 'hi, load2', varthatnotstring ";

我想使用regex在每个,上拆分上述字符串,同时保留引号内的字符串。

因此,拆分MyName应该得到:

1: 'hi, load1'
2: 'hi, load2'
3: varthatnotstring

我目前使用regex MyR("(.),(.),(.*)");,但这给了我:

1: 'hi
2: load1'
3: 'hi
4: load2'

  • 我应该使用什么正则表达式?

根据您希望如何处理某些极端情况,您可以使用以下命令:

std::regex reg(R"--((('.*?')|[^,])+)--");

Step, by Step:

  • 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