c++ - 将以\r\n 分隔的字符串拆分为字符串数组 [C/C++]

标签 c++ arrays regex split line-breaks

我有包含例如的字符串"FirstWord\r\nSecondWord\r\nThird Word\n\r"等等... 我想使用 vector <string> 将它拆分为字符串数组所以我会得到:

FileName[0] == "FirstWord";
FileName[1] == "SecondWord"; 
FileName[2] == "Third Word";

另外,注意第三个字符串中的空格。

这是我目前所得到的:

string text = Files; // Files var contains the huge string of lines separated by \r\n
vector<string> FileName; // (optionaly) Here I want to store the result without \r\n

regex rx("[^\\s]+\r\n");
sregex_iterator FormatedFileList(text.begin(), text.end(), rx), rxend;

while(FormatedFileList != rxend)
{
    FileName.push_back(FormatedFileList->str().c_str());
    ++FormatedFileList;
}

它有效,但是当涉及到第三个字符串时 "Third Word\r\n" , 它只给我 "Word\r\n" .

谁能给我解释一下正则表达式是如何工作的?我有点困惑。

最佳答案

\s 匹配所有空格,包括常规空格、制表符和其他一些空格。你只想排除 \r\n,所以你的正则表达式应该是

regex rx("[^\r\n]+\r\n");

编辑:这不适合发表评论,也不会详尽无遗——正则表达式是一个相当复杂的主题,但我会尽力给出一个粗略的解释。如果你理解形式语言,所有这些确实更有意义,所以我鼓励你继续阅读它,网上有无数的正则表达式教程,它们更详细,你也应该阅读。好的。

您的代码使用 sregex_iterator 遍历字符串 text 中正则表达式 rx 匹配的所有位置,然后将它们转换为字符串并救了他们。那么,什么是正则表达式?

正则表达式是一种将模式匹配应用于字符串的方法。这可以从简单的子字符串搜索到……嗯,到复杂的子字符串搜索,真的。例如,您可以在字符串 "foobar" 中搜索 "oba" 的实例,而不是仅仅搜索 "oo"由任何后跟 "a" 的字符组成,并在 "foobar""foonarf" 中找到它。

为了启用这种模式搜索,您必须有一种方法来指定您要查找的模式,正则表达式就是一种这样的方法。细节因实现而异,但通常它通过定义匹配特殊事物的特殊字符或修改模式其他部分的行为来工作。这听起来令人困惑,所以让我们考虑几个例子:

  • 句号.匹配任何单个字符
  • Kleene 星号 * 之后的某物匹配该某物的零个或多个实例
  • 后跟 + 的内容将匹配该内容的一个或多个实例
  • 方括号[, ]括起一组字符;然后整个事情匹配这些字符中的任何一个。
  • 插入符号 ^ 反转括号表达式的选择

还是一头雾水。所以让我们把它放在一起:

oo.a

是使用.的正则表达式。这将匹配“oo.a”、“ooba”、“oona”、“oo|a”以及任何其他由两个 o 后跟一个字符后跟一个 a 组成的字符。它不会匹配“ooa”、“oba”或“nonsense”。

a*

将匹配“”、“a”、“aa”、“aaa”以及任何其他仅由 a 组成的序列。

[fgh]oobar

将匹配“foobar”、“goobar”和“hoobar”中的任何一个,没有别的。

[^fgh]oobar

将匹配“aoobar”、“boobar”、“coobar”等但不匹配“foobar”、“goobar”和“hoobar”。

[^fgh]+oobar

将匹配“aoobar”、“aboobar”、“abcoobar”,但不匹配“oobar”、“foobar”、“agoobar”和“abhoobar”。

在你的情况下,

[^\r\n]+\r\n

将匹配一个或多个字符的任何实例,这些字符既不是 \r 也不是 \n 后跟 \r\n。然后,您遍历所有这些匹配项并保存 text 的匹配部分。

我相信我可以合理地走到这里。这个兔子洞很深,这意味着你可以用正则表达式做一些非常酷的事情,但你不应该指望在一两天内就能掌握它们。其中大部分内容与我刚才概述的内容一致,但以真正的程序员方式,大多数正则表达式实现都超出了正则语言和表达式的数学范围,并引入了有用但费脑筋的东西。龙在前面,但旅程是值得的。

关于c++ - 将以\r\n 分隔的字符串拆分为字符串数组 [C/C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27209457/

相关文章:

c++ - GCC - 多个预编译头文件和特定路径

java - 如何从文件中获取数据并替换数独游戏中的预定义数组

java - 在Java中,如何抓取数组列表中的特定行?

regex - 使用正则表达式搜索一个词的多次出现

java - 需要找到航类号的正则表达式

c++ - QWidget 每像素半透明

c++ - 如何用较小的数组填充动态二维数组的中间?

c++ - 表达式 : string iterator not dereferencable while using boost regex

c++ - 写入数组时出现段错误

javascript - 未获取表中的表达式值