这个问题在这里已有答案:
我使用以下代码在C中解析字符串:
string parsed,input="text to be parsed";
stringstream input_stringstream(input);
if(getline(input_stringstream,parsed,' '))
{
// do some processing.
}
使用单个char分隔符进行解析很好 . 但是,如果我想使用字符串作为分隔符,该怎么办?
示例:我想拆分:
scott>=tiger
用> =作为分隔符,这样我就能得到斯科特和老虎 .
11 回答
您可以使用std::string::find()函数查找字符串分隔符的位置,然后使用std::string::substr()获取令牌 .
例:
find(const string& str, size_t pos = 0)
函数返回字符串中第一次出现的str
的位置,如果找不到该字符串,则返回npos .substr(size_t pos = 0, size_t n = npos)
函数返回对象的子字符串,从位置pos
开始,长度为npos
.如果您有多个分隔符,则在提取一个标记后,可以将其删除(包括分隔符)以继续进行后续提取(如果要保留原始字符串,只需使用
s = s.substr(pos + delimiter.length());
):这样您就可以轻松循环获取每个令牌 .
完整示例
输出:
此方法使用
std::string::find
而不通过记住前一个子字符串标记的开头和结尾来改变原始字符串 .您可以使用next函数来拆分字符串:
strtok允许您传递多个字符作为分隔符 . 我打赌如果你传入">="你的示例字符串将被正确分割(即使>和=被计为单独的分隔符) .
编辑如果您不想使用
c_str()
将字符串转换为字符*,则可以使用substr和find_first_of进行标记 .此代码从文本中分割行,并将所有人添加到矢量中 .
被称为:
用于字符串分隔符
基于字符串分隔符拆分字符串 . 如基于字符串分隔符
"-+"
拆分字符串"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
,输出将为{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Output
对于单字符分隔符
基于字符分隔符拆分字符串 . 如分割字符串
"adsf+qwer+poui+fdgh"
与分隔符"+"
将输出{"adsf", "qwer", "poui", "fdg"h}
Output
我会用
boost::tokenizer
. 这里是解释如何制作适当的标记化函数的文档:http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htm这是适用于您的情况的一个 .
这是我对此的看法 . 它处理边缘情况并采用可选参数从结果中删除空条目 .
例子
如果你不想修改字符串(如Vincenzo Pii的答案) and 也希望输出最后一个标记,你可能想要使用这种方法:
P.S:仅当分裂后字符串的长度相等时才有效