2012-07-06 62 views
0

我有一个太长的字符串,我想查找并找到所有需要的单词。例如,我想查找字符串中所有“苹果”的位置。你能告诉我我是怎么做到的吗? 谢谢在字符串中查找所有想要的单词

+1

查找到的boost ::正则表达式,如果你需要匹配更复杂的东西。否则,坚持Frerich Raabe的回答。 – 2012-07-06 13:02:36

回答

4

重复应用std::string::find如果您使用的是C++字符串,或者std::strstr如果您使用的是C字符串;在这两种情况下,在每次迭代中,在最后一次匹配后开始搜索n个字符,其中n是单词的长度。

std::string str="one apple two apples three apples"; 
std::string search="apple"; 
for(std::string::size_type pos=0; pos<str.size(); pos+=search.size()) 
{ 
    pos=str.find(search, pos); 
    if(pos==std::string::npos) 
     break; 
    std::cout<<"Match found at: "<<pos<<std::endl; 
} 

link

+0

这不会找到重叠的匹配 - 例如对于模式眼睛和眼睛线眼睛而言,迄今为止给出的所有答案只能找到第一个出现。 – 2012-07-06 13:12:49

+0

我认为如果匹配在字符串的末尾,就会中断。如果'str'会以'apple'结尾。在这种情况下,你可以调用'std :: string :: find(search,pos);',其值'pos'等于'size()'。不确定这是否允许。 – 2012-07-06 13:18:32

+0

@IvanVergiliev:如果这是你想要的,取决于你想用这个函数实现什么规范(这两个规范都有有效的用例);仍然,所有需要的是将'pos + = ...'改为'pos ++'。 – 2012-07-06 18:55:27

2

使用一个循环反复调用std::string::find;在每次迭代,你开始寻找超越你最后的命中:

std::vector<std::string::size_type> indicesOf(const std::string &s, 
               const std::string &needle) 
{ 
    std::vector<std::string::size_type> indices; 
    std::string::size_type p = 0; 
    while (p < s.size()) { 
    std::string::size_type q = s.find(needle, p); 
    if (q == std::string::npos) { 
     break; 
    } 
    indices.push_back(q); 
    p = q + needle.size(); // change needle.size() to 1 for overlapping matches 
    } 
    return indices; 
} 
0
void findApples(const char* someString) 
{ 
    const char* loc = NULL; 
    while ((loc = strstr(someString, "apple")) != NULL) { 
     // do something 
     someString = loc + strlen("apple"); 
    } 
} 
+0

鉴于qustion是关于C++的,我会考虑一个关于'std :: string'的回答更合适。 – 2012-07-06 13:01:01

相关问题