Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将由分隔的字符串\r\n拆分为字符串数组[C/C+;+;]_C++_Arrays_Regex_Split_Line Breaks - Fatal编程技术网

C++ 将由分隔的字符串\r\n拆分为字符串数组[C/C+;+;]

C++ 将由分隔的字符串\r\n拆分为字符串数组[C/C+;+;],c++,arrays,regex,split,line-breaks,C++,Arrays,Regex,Split,Line Breaks,我有一个字符串,包含例如“FirstWord\r\n第二个单词\r\n第三个单词\r\n”等等。。。 我想使用vector将其拆分为字符串数组,以便得到: FileName[0] == "FirstWord"; FileName[1] == "SecondWord"; FileName[2] == "Third Word"; 另外,请注意第三个字符串中的空格 到目前为止,我得到的是: string text = Files; // Files var contains the huge st

我有一个字符串,包含例如
“FirstWord\r\n第二个单词\r\n第三个单词\r\n”
等等。。。 我想使用
vector
将其拆分为字符串数组,以便得到:

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;
}
string text=文件;//Files var包含由分隔的巨大行字符串\r\n
矢量文件名;//(可选)我想在这里存储结果,不带\r\n
正则表达式rx(“[^\\s]+\r\n”);
sregex_迭代器格式化文件列表(text.begin(),text.end(),rx),rxend;
while(格式化文件列表!=rxend)
{
FileName.push_back(格式化文件列表->str().c_str());
++格式化文件列表;
}
它可以工作,但是当涉及到第三个字符串时,即
“third Word\r\n”
,它只会给我
“Word\r\n”


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

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

regex rx("[^\r\n]+\r\n");
编辑:这不适合评论,也不可能详尽无遗——正则表达式是一个相当复杂的主题,但我会尽力给出一个粗略的解释。如果你对正式语言感兴趣的话,所有这些都会更有意义,所以我鼓励你仔细阅读,网上有无数的正则表达式教程,它们会更详细,你也应该阅读。好的

代码使用
sregex_迭代器
遍历字符串
text
中正则表达式
rx
匹配的所有位置,然后将它们转换为字符串并保存。那么,什么是正则表达式

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

为了启用这种模式搜索,必须有一种方法来指定要查找的模式,其中一种方法是正则表达式。各个实现的细节各不相同,但一般来说,它通过定义与特殊事物匹配的特殊字符或修改模式其他部分的行为来工作。这听起来很混乱,所以让我们考虑几个例子:

  • 句点
    匹配任何单个字符
  • Kleene星号后面的某物
    *
    匹配该某物的零个或多个实例
  • 后跟
    +
    的内容将匹配该内容的一个或多个实例
  • 括号
    [
    ]
    包含一组字符;然后,整个过程与这些角色中的任何一个匹配
  • 插入符号
    ^
    反转括号表达式的选择
仍然令人困惑。让我们把它放在一起:

oo.a
是使用
的正则表达式。这将匹配“oo.a”、“ooba”、“oona”、“oo | a”和任何其他两个o后跟一个字符再后跟一个a的字符。它不会匹配“ooa”、“oba”或“胡说八道”

将匹配“、”a“、”aa“、”aaa”和任何其他仅由a组成的序列,而不包括其他序列

[fgh]oobar
[^fgh]oobar
将匹配“foobar”、“goobar”和“hoobar”中的任何一个,而不是其他

[fgh]oobar
[^fgh]oobar
将匹配“aoobar”、“boobar”、“coobar”等,但不匹配“foobar”、“goobar”和“hoobar”

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

就你而言

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


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

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

regex rx("[^\r\n]+\r\n");
编辑:这不适合评论,也不可能详尽无遗——正则表达式是一个相当复杂的主题,但我会尽力给出一个粗略的解释。如果你对正式语言感兴趣的话,所有这些都会更有意义,所以我鼓励你仔细阅读,网上有无数的正则表达式教程,它们会更详细,你也应该阅读。好的

代码使用
sregex_迭代器
遍历字符串
text
中正则表达式
rx
匹配的所有位置,然后将它们转换为字符串并保存。那么,什么是正则表达式

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

为了启用这种模式搜索,必须有一种方法来指定要查找的模式,其中一种方法是正则表达式。具体细节在不同的实现中有所不同,但总的来说,it是可行的
char * pch = strtok((LPSTR)Files.c_str(), "\r\n");
while(pch != NULL)
{
    FileName.push_back(pch);
    pch = strtok(NULL, "\r\n");
}