[C++]将一个字符串切成字符串,由另一个字符串中给出的符号以外的任何内容分隔
[C++]Cut up a string into strings separated by anything other than symbols given in another string?
编辑:这不是重复的!给出的链接中的问题有所不同。我没有用空格分隔,而是用给定字符串中的字符以外的任何内容分隔。因此,另一个线程中的答案不起作用。
EDIT2:请注意,我没有分隔符,我需要用除notOf
以外的任何东西分隔。
在我的程序中,这意味着将名为 word 的字符串切割成名为 words 的向量中的字符串,这些向量由 notOf
以外的任何内容组成并分隔。所以notOf
有点像getline
中的分隔物。
例如,"&otherwise[taken=(and)-redacted-"
应该变成"otherwise"
、"taken"
、"and"
和"redacted"
。
试过写作,想出了你在下面看到的东西,但它不起作用,而且,我被告知,相当丑陋。用你的判断来判断它是否值得修复或重新编写。
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
string notOf = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789$'"";
string word = "&otherwise[taken=(and)-redacted-";
stringstream in(word);
vector<string> words;
if (word.find_first_not_of(notOf) == string::npos)
words.push_back(word);
else while (word.find_first_not_of(notOf) != string::npos)
{
int index = word.find_first_not_of(notOf);
string tok;
getline(in, tok, word[index]);
if (index != 0)
words.push_back(tok);
word = word.substr(index);
}
for (vector<string>::iterator it = words.begin(); it != words.end(); ++it)
cout << *it << endl;
system("pause");
return 0;
}
你可以试试这个:
vector<string>split(string str,string Separator)
{
vector<string>answer;
string temp;
int len=str.size();
for(int i=0;i<len;i++)
{
bool isSeparator=false;
for(int j=0;j<Separator.length();j++)
{
if(str[i]==Separator[j])
isSeparator=true;
}
if(!isSeparator)
{
temp+=str[i];
continue;
}
if(temp!="")
answer.push_back(temp);
temp="";
}
if(temp!="")
answer.push_back(temp);
return answer;
}
您只需要在字符串Separator
指定分隔符即可。此函数将返回分隔的字符串。在这里,分离将发生在其中一个Separator
发现的地方。
编辑:
如果要对notOf
进行分区(即notOf
以外的),可以执行以下操作:
vector<string>split(string str,string Separator)
{
vector<string>answer;string temp;
int len=str.size();
for(int i=0;i<len;i++)
{
bool isSeparator=true;
for(int j=0;j<Separator.length();j++)
{
if(str[i]==Separator[j])
isSeparator=false;
}
if(!isSeparator)
{
temp+=str[i];
continue;
}
if(temp!="")
answer.push_back(temp);
temp="";
}
if(temp!="")
answer.push_back(temp);
return answer;
}
int main()
{
string notOf = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789$'"";
string word = "&otherwise[taken=(and)-redacted-";
vector<string>v=split(word,notOf);
for(int i=0;i<v.size();i++)
cout<<v[i]<<"n";
return 0;
}
希望对:)有所帮助
我正在考虑最优雅的方法,如果您被赋予一系列分隔符或有效字符,并且只使用标准库。
以下是我的想法:
通过一系列分隔符将单词拆分为字符串向量:
template<class Container>
std::vector<std::string> split_by_delimiters(const std::string& input, const Container& delimiters)
{
std::vector<std::string> result;
for (auto current = begin(input) ; current != end(input) ; )
{
auto first = find_if(current, end(input), not_in(delimiters));
if (first == end(input)) break;
auto last = find_if(first, end(input), is_in(delimiters));
result.emplace_back(first, last);
current = last;
}
return result;
}
要以另一种方式拆分,请通过提供一系列有效字符:
template<class Container>
std::vector<std::string> split_by_valid_chars(const std::string& input, const Container& valid_chars)
{
std::vector<std::string> result;
for (auto current = begin(input) ; current != end(input) ; )
{
auto first = find_if(current, end(input), is_in(valid_chars));
if (first == end(input)) break;
auto last = find_if(first, end(input), not_in(valid_chars));
result.emplace_back(first, last);
current = last;
}
return result;
}
is_in和not_in的定义如下:
namespace detail {
template<class Container>
struct is_in {
is_in(const Container& charset)
: _charset(charset)
{}
bool operator()(char c) const
{
return find(begin(_charset), end(_charset), c) != end(_charset);
}
const Container& _charset;
};
template<class Container>
struct not_in {
not_in(const Container& charset)
: _charset(charset)
{}
bool operator()(char c) const
{
return find(begin(_charset), end(_charset), c) == end(_charset);
}
const Container& _charset;
};
}
template<class Container>
detail::not_in<Container> not_in(const Container& c)
{
return detail::not_in<Container>(c);
}
template<class Container>
detail::is_in<Container> is_in(const Container& c)
{
return detail::is_in<Container>(c);
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 使用另一个字符串从字符串中删除空格
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何在使用 getch 后在另一个字符串的末尾连接一个字符串
- 如何在另一个字符串的x位置插入一个字符串?
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- C++:递归地将字符串中一个字母的所有实例替换为另一个字母
- 在另一个字符串中插入文件扩展名之前的字符串
- 使用C++将一个字符串替换为另一个字符串
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将字符串中的单个单词替换为另一个单词
- 将文本流中一个字符串的所有匹配项替换为另一个字符串
- 无法将字符串用作另一个类的参数
- 另一个字符串文字,UDL 迷宫
- 在给定字符串上使用 tolower() 和 isalpha() 并将其输出设置为另一个字符串
- 如何使用循环从另一个字符串创建一个没有空格的新字符串