C++ 在C+;中搜索strtok()的替代方法+;
我使用strtok将字符串分成几个部分。 在本例中,将从字符串中读取所有部分,该字符串以冒号或分号为边界C++ 在C+;中搜索strtok()的替代方法+;,c++,split,strtok,C++,Split,Strtok,我使用strtok将字符串分成几个部分。 在本例中,将从字符串中读取所有部分,该字符串以冒号或分号为边界 char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees"; char delimiter[] = ":;"; char *p; p = strtok(string, delimiter); while(p != NULL) { cout << "Result: " <&l
char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = ":;";
char *p;
p = strtok(string, delimiter);
while(p != NULL) {
cout << "Result: " << p << endl;
p = strtok(NULL, delimiter);
}
但我希望得到这样的结果:
Result: Alice1:
Result: Alice2;
Result: Bob1:
Result: Bob2;
限制是当我使用strtok时,我只能选择单个字符。
有人知道strtok的另一个替代方案吗?我也可以搜索字符串?
或者有人有办法解决我的问题吗?使用您指定的数据集无法按您想要的方式正确分割它。您可以提出一个“仅此而已”的规则,将您显示的数据按字面意思进行拆分,但鉴于数据的混乱性质,很可能在其他示例中失败。让我们从这个令牌开始
IscoolAlice2
一个计算机程序怎么知道这部分的哪个是名字,哪个不是?你想让“Alice2”离开这里。如果您决定用大写字母指定一个名称,那么它只会吐出“name”IscoolAlice2。同样适用于:
knowsBeepBob2
如果您搜索第一个大写字母,则程序将确定其名称为BeepBob2,因此在每种情况下,搜索令牌中最后出现的大写字母都会找到该名称。但是如果一个名字包含两个大写字母呢?程序会把他们的名字删掉,你对此无能为力
如果你乐于接受这些限制,你可以通过strtok只使用;字符,它给出:
Alice1:IscoolAlice2
Alert555678
Bob1:knowsBeepBob2
sees
这不太理想。然后,您可以指定一个规则,以便在包含:的任何行中都存在一个名称,将:中剩余的任何内容作为名称,然后查找最后一个大写字母,以及从该点开始的任何内容也是名称。这会给你想要的输出
但我概述的规则对于刚刚输入的数据非常具体。如果关于其他数据样本的任何内容与此完全不同(例如,名称中有两个大写字母),那么它将失败,因为程序无法确定“名称”的起始位置
解决这一问题的唯一方法是返回数据的来源,并以不同的格式对其进行格式化,以便在名称之前有某种标点符号
或者,您需要一个包含所有可能出现的名称的完整数据库,然后搜索这些名称,查找到下一个名称之前的任何字符:或;并附加它们并打印名称。但这似乎非常不切实际。这只是一个简单的刮擦逻辑,大致如下:
char *ptr = string;
while(*ptr)
{
printf("Result:");
while(*ptr)
{
printf("%c", *ptr);
if(ispunc(*ptr))
{
ptr++;
printf("\n");
break;
}
else
{
ptr++;
}
}
}
由于需要更复杂的搜索,因此无法使用strtok执行该任务
虽然我不确定什么是您的字符串
作为分隔符,但可以使用以下命令完成相同的输出:
char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = "(?:Alice|Bob)\\d.";
std::regex regex( delimiter );
std::regex_iterator< const char* > first( std::begin( string ), std::end( string ), regex ), last;
while( first != last ){
std::cout << "Result: " << first->str() << '\n';
++first;
}
您打算如何将Iscool一词与Alice2分开?没有差距。你可能想要。我认为你需要提供一个更清晰的问题陈述。你似乎在寻找在之前或之后发生的事情:以;然后把所有的东西都记下来,包括最后一个大写字母。非常感谢k-five!这正是我所需要的@卡达木不是问题
char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = "(?:Alice|Bob)\\d.";
std::regex regex( delimiter );
std::regex_iterator< const char* > first( std::begin( string ), std::end( string ), regex ), last;
while( first != last ){
std::cout << "Result: " << first->str() << '\n';
++first;
}
Result: Alice1;
Result: Alice2;
Result: Bob1;
Result: Bob2;