使用字符串分隔符在C++中解析(分割)一个字符串(标准C++)。
我正在用C++语言解析一个字符串,方法如下。
string parsed,input="text to be parsed";
stringstream input_stringstream(input);
if(getline(input_stringstream,parsed,' '))
{
// do some processing.
}
用单字符定界符进行解析是可以的。但如果我想用一个字符串作为分隔符,该怎么办。
例如。我想分割。
scott>=tiger
用>=作为分隔符,这样我就可以得到scott和tiger。
304
14
你可以使用[
std::string::find()
][1]函数找到你的字符串分隔符的位置,然后使用[std::string::substr()
][2]来获得一个标记。例子。
find(const string& str, size_t pos = 0)
函数返回str
在字符串中第一次出现的位置,如果没有找到该字符串,则返回[npos
][3]。substr(size_t pos = 0, size_t n = npos)
函数返回对象的子串,从pos
位置开始,长度为npos
。如果你有多个定界符,在你提取了一个标记后,你可以删除它(包括定界符)以继续进行后续的提取(如果你想保留原始字符串,只需使用
s = s.substr(pos + delimiter.length());
)。这样,你就可以很容易地循环获得每个标记。
完整示例
本方法使用
std::string::find
,通过记住前一个子串标记的开头和结尾,不对原始字符串进行突变。你可以使用下一个函数来分割字符串。
用于字符串定界符
根据字符串定界符来拆分字符串。 如根据字符串定界符
"-+"
拆分字符串"-+"
,输出将是{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
。strtok允许你传递多个字符作为分隔符。我敢打赌,如果你输入">=",你的例子字符串会被正确分割(尽管>和=被算作单独的分隔符)。
编辑:如果你不想使用
c_str()
将字符串转换为char*,你可以使用substr和find_first_of来进行标记。这段代码从文本中拆分出一行,并将所有人加到一个向量中。
召集人:
这里'是我对这个问题的看法。 它处理了边缘情况,并接受了一个可选的参数来从结果中删除空条目。
例子
我将使用
boost::tokenizer
。 这里的文档解释了如何制作一个合适的标记器函数:http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htm这里有一个适合你情况的函数。
这是一个完整的方法,可以在任何定界符上分割字符串,并返回一个被分割的字符串的向量。
它是根据 ryanbwork 的答案改编的。 然而,他的检查是
if(token != mystring)
如果你的字符串中有重复的元素,会得到错误的结果。 这是我解决这个问题的方法。答案已经有了,但是选择答案使用的是擦除功能,这非常昂贵,想一想一些非常大的字符串(以MB为单位)。 因此我使用了下面的函数。
如果您不想修改字符串(就像 Vincenzo Pii 的答案一样),并且**想把最后一个 token 也输出,您可能想使用这种方法。
这对于字符串(或单字符)定界符应该是完美的,不要忘记包含
#include <sstream>
。 不要忘记包含#include <sstream>
。