C++ 如何将这些字符串拆分为数组
我正在寻找一种方法,将下面的文本行拆分为一个数组 这里有一些文本\r\n“这里是另一行”\r\n和另一行 这样,生成的数组是: 这里有一些文本 \r\n “ 这里还有一行 “ \r\n 和另一行 注意这里基本上有两个测厚仪,“和\r\nC++ 如何将这些字符串拆分为数组,c++,split,C++,Split,我正在寻找一种方法,将下面的文本行拆分为一个数组 这里有一些文本\r\n“这里是另一行”\r\n和另一行 这样,生成的数组是: 这里有一些文本 \r\n “ 这里还有一行 “ \r\n 和另一行 注意这里基本上有两个测厚仪,“和\r\n 我需要在C++中做这件事,将来还会有额外的分界符。 有什么想法吗 提前谢谢 编辑:不,这不是家庭作业 以下是我目前掌握的情况: const RWCString crLF = "\r\n"; const RWCString doubleQuot
我需要在C++中做这件事,将来还会有额外的分界符。 有什么想法吗 提前谢谢 编辑:不,这不是家庭作业 以下是我目前掌握的情况:
const RWCString crLF = "\r\n";
const RWCString doubleQuote = "\"";
RWTValOrderedVector<RWCString> Split(const RWCString &value, const RWCString &specialContent)
{
RWTValOrderedVector<RWCString> result;
unsigned index = 0;
RWCString str = value;
while ( ( index = str.index( specialContent, 0, RWCString::ignoreCase ) ) != RW_NPOS )
{
RWCString line = str(0, index);
result.append(line);
result.append(specialContent);
str = str(index, str.length() - index);
str = str(specialContent.length(), str.length() - specialContent.length());
}
if (str.length() > 0)
{
result.append(str);
}
return result;
}
void replaceSpecialContents(const RWCString &value)
{
RWTValOrderedVector<RWCString> allStrings;
RWTValOrderedVector<RWCString> crLFStrings = Split(value, crLF);
for (unsigned i=0; i<crLFStrings.entries(); i++)
{
RWTValOrderedVector<RWCString> dqStrings = Split(crLFStrings[i], doubleQuote);
if (dqStrings.entries() == 1)
{
allStrings.append(crLFStrings[i]);
}
else
{
for (unsigned j=0; j<dqStrings.entries(); j++)
{
allStrings.append(dqStrings[j]);
}
}
}
}
const RWCString crLF=“\r\n”;
常量RWCString doubleQuote=“\”;
RWTValOrderedVector拆分(常量RWCString和值、常量RWCString和特殊内容)
{
RWTValOrderedVector结果;
无符号索引=0;
RWCString str=值;
而((index=str.index(specialContent,0,RWCString::ignoreCase))!=RW\u NPOS)
{
RWCString line=str(0,索引);
结果。追加(行);
结果。追加(特殊内容);
str=str(索引,str.length()-index);
str=str(specialContent.length(),str.length()-specialContent.length());
}
如果(str.length()>0)
{
结果:追加(str);
}
返回结果;
}
无效替换特殊内容(常量RWCString和值)
{
RWTValOrderedVector所有字符串;
RWTValOrderedVector crLFStrings=Split(值,crLF);
for(unsigned i=0;igetline
有一个可选的定界符,因此您可以使用stringstream
来完成此操作,而您只需付出很少的努力。缺点是(我相信)它一次只能使用一个定界符。将问题分解如下:
我有一个指向子字符串的指针。如何找到下一个子字符串
我有一个指向子字符串的指针。如何将其添加为数组的下一个元素
现在,解决1和2。如果有任何问题,请再次询问。您可以使用and。只需小心检查是否有“空”字符串;find\u首先
将找到char
s,因此\r
和\n
都将由结果算法分割
或者,迭代整个字符串,并在遇到另一个分隔符时复制上一部分。这里有一种方法可以在C和C++中使用:
//String to tokenize:
char str[] = "let's get some tokens!";
//A set of delimiters:
char delims[] = " ";
//List of tokens:
char *tok1 = NULL,
*tok2 = NULL,
*tok3 = NULL;
//Tokenize the string:
tok1 = strtok(str, delims);
tok2 = strtok(NULL, delims); //after you get the first token
tok3 = strtok(NULL, delims); //supply "NULL" as first strtok parameter
可以用多种方式修改。可以将所有“Strutk(null,DelIMS)”调用放在一个循环中,使其更灵活,可以使用C++字符串使用.cxString()等。
< P>一个非常简单的方法就是使用Flex:
您可以在非常可读的几行中为C++应用程序构建一个更简单的Listor。
注:
请注意,您应该小心使用“\r\n”。如果以文本模式(默认)打开文件,则标准流读取将标准行终止序列转换为“\n”。在某些平台上,行结束终止序列为“\r\n”,因此,如果从文件中读取流,则可能只看到“\n”字符
split.lex
main.cpp
运行(在预先准备好的文件上)
下面是一个使用TR1正则表达式特性的方法
std::string text("Here is some text\r\n\"here is another line\"\r\nAnd another line");
std::vector<std::string> vec;
std::regex rx("[\\w ]+|\\r\\n|\"");
std::sregex_iterator rxi(text.begin(), text.end(), rx), rxend;
for (; rxi != rxend; ++rxi)
{
vec.push_back(rxi->str());
}
std::string text(“这里是一些文本\r\n\”这里是另一行\“\r\n另一行”);
std::vec;
std::regex rx(“[\\w]+\\\r\\n\\”);
sregex_迭代器rxi(text.begin(),text.end(),rx),rxend;
对于(;rxi!=rxend;++rxi)
{
向量推回(rxi->str());
}
在我的测试中,这将使用示例中的7个子字符串填充向量。我不是专家,因此可能有一个比我使用的更正确的正则表达式。strtok将用NULL替换您的标记。这就是为什么它不包括标记
man strtok了解更多信息。我也在玩strtok和strtok_r,因为我有以下传入的字符数组
你好~Milktea~这是我的留言\r\n留言~我有一块好手表~Cartier\r\n
我将首先剥离~(tildes),然后是\r\n,反之亦然。基于您正在使用的Rogue Wave SourcePro API,您可以使用RWTRegex将字符串拆分为令牌:
RWTValOrderedVector<RWCString> tokenize(const RWCString& str)
{
RWTRegex<char> re("\\r\\n|\"|([^\"\\r]|\\r[^\\n])*|\\r$");
RWTRegex<char>::iterator it(re, str);
RWTValOrderedVector<RWCString> result;
for (; it != RWTRegex<char>::iterator(); ++it) {
result.append(it->subString(str));
}
return result;
}
RWTValOrderedVector标记化(常量RWCString&str)
{
RWTRegex re(“\\r\\n|\”|([^\\\r]\\r[^\\n])*\\r$”;
rwtreegex::迭代器it(re,str);
RWTValOrderedVector结果;
for(;it!=rwtreegex::iterator();++it){
result.append(it->subString(str));
}
返回结果;
}
有关rwtreex的详细信息,请参阅。您已经尝试了哪些方法?基本上,您希望将其拆分为令牌(虽然令牌通常不是整行)。为了标记输入,您需要一个lexer。请小心使用“\r\n”。在某些平台上,这是行终止序列。因此,如果您以文本模式(默认)打开文件这两个字符将转换为单个'\n'字符(在某些平台上)。另请注意:'\n'字符在写入文件(以文本模式打开)时会转换为行终止序列.RWTValOrderedVector
:只是想知道,什么是无序向量?@ybungalobill-RWTValVector
,不幸的是,它对方法有限制。例如,没有append
,因为类假设向量的生命周期为常数。有一个重塑,所以如果你为它工作,你可以进行追加。谢谢,我已经试过了,但不包括代币
% flex split.lex
% g++ main.cpp lex.yy.cc
% cat testfile | ./a.exe
Token: 3(Here is some text)
Token: 2(
)
Token: 1(")
Token: 3(here is another line)
Token: 1(")
Token: 2(
)
Token: 3(And another line)
std::string text("Here is some text\r\n\"here is another line\"\r\nAnd another line");
std::vector<std::string> vec;
std::regex rx("[\\w ]+|\\r\\n|\"");
std::sregex_iterator rxi(text.begin(), text.end(), rx), rxend;
for (; rxi != rxend; ++rxi)
{
vec.push_back(rxi->str());
}
RWTValOrderedVector<RWCString> tokenize(const RWCString& str)
{
RWTRegex<char> re("\\r\\n|\"|([^\"\\r]|\\r[^\\n])*|\\r$");
RWTRegex<char>::iterator it(re, str);
RWTValOrderedVector<RWCString> result;
for (; it != RWTRegex<char>::iterator(); ++it) {
result.append(it->subString(str));
}
return result;
}