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)
唯一的问题是,在程序遇到标点符号的地方,现在有标记作为空白。有什么建议么?
找到分隔符后,您应该将子字符串开始移动到作为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)
Hello
everyone
This
is
COSC-1436
SP18
Run Code Online (Sandbox Code Playgroud)
您可以使用它,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)