在C ++中使用多个定界符分割字符串

Tri*_*tan 1 c++ string split token delimiter

因此,我必须将短语“ Hello,每个人!这是:COSC-1436,SP18”拆分为单独的标记,删除所有标点符号减去破折号。因此输出应为:

你好

大家

这个

COSC-1436

SP18

然后,我必须加密覆盖的每个令牌。我只是在使用多个定界符时遇到麻烦。这是我目前所拥有的。

功能原型: void tokenize(const string&, const string&, vector<string>&);

函数调用: tokenize(code, " .,:;!?", tokens);

功能定义:

void tokenize(const string& str, const string& delim, vector<string>& tokens)
{
    int tokenStart = 0;

    int delimPos = str.find_first_of(delim);

    while(delimPos != string::npos)
    {
        string tok = str.substr(tokenStart, delimPos - tokenStart);

        tokens.push_back(tok);

        delimPos++;

        tokenStart = delimPos;

        delimPos = str.find_first_of(delim, delimPos);

        if(delimPos == string::npos)
        {
            string tok = str.substr(tokenStart, delimPos - tokenStart);

            tokens.push_back(tok);
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在程序遇到标点符号的地方,现在有标记作为空白。有什么建议么?

Kil*_*Kid 8

找到分隔符后,您应该将子字符串开始移动到作为first_not_of分隔符的字符。基本改变:

delimPos++;
Run Code Online (Sandbox Code Playgroud)

到:

delimPos = str.find_first_not_of(delim, delimPos + 1);
Run Code Online (Sandbox Code Playgroud)

这将确保当您按顺序有 2 个或更多分隔符时,将delimPos移到最后一个之外。

或者你可以试试这个:

#include <iostream> 
#include <string>

int main()
{
    std::string str = "Hello, everyone! This is: COSC-1436, SP18";
    std::string const delims{ " .,:;!?" };

    size_t beg, pos = 0;
    while ((beg = str.find_first_not_of(delims, pos)) != std::string::npos)
    {
        pos = str.find_first_of(delims, beg + 1);
        std::cout << str.substr(beg, pos - beg) << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

https://ideone.com/LJota9

Hello
everyone
This
is
COSC-1436
SP18
Run Code Online (Sandbox Code Playgroud)


Ste*_*ebb 5

您可以使用它,std::regex_iterator因为这正是它的设计目的。

#include <regex>
#include <iostream>
#include <string>

int main()
{
    const std::string s = "Hello, everyone! This is: COSC-1436, SP18";

    std::regex words_regex("[^\\s.,:;!?]+");
    auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
    auto words_end = std::sregex_iterator();

    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
        std::cout << (*i).str() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

该完整程序的输出就是这个。

Hello
everyone
This
is
COSC-1436
SP18
Run Code Online (Sandbox Code Playgroud)

  • 那是纯 C++11。 (2认同)