C++ 如何将这些字符串拆分为数组

C++ 如何将这些字符串拆分为数组,c++,split,C++,Split,我正在寻找一种方法,将下面的文本行拆分为一个数组 这里有一些文本\r\n“这里是另一行”\r\n和另一行 这样,生成的数组是: 这里有一些文本 \r\n “ 这里还有一行 “ \r\n 和另一行 注意这里基本上有两个测厚仪,“和\r\n 我需要在C++中做这件事,将来还会有额外的分界符。 有什么想法吗 提前谢谢 编辑:不,这不是家庭作业 以下是我目前掌握的情况: const RWCString crLF = "\r\n"; const RWCString doubleQuot

我正在寻找一种方法,将下面的文本行拆分为一个数组

这里有一些文本\r\n“这里是另一行”\r\n和另一行

这样,生成的数组是:

这里有一些文本

\r\n

这里还有一行

\r\n

和另一行

注意这里基本上有两个测厚仪,\r\n
我需要在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;i
getline
有一个可选的定界符,因此您可以使用
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;
    }