2014-09-30 77 views
0

我正在开发一个多线程项目,其中对于需要查找字符串中是否存在给定字符序列的项目的一个段。我想知道如果C++/C有任何预处理函数可以处理这个问题,但无法找出确切的'定义'来搜索。预编译函数在字符串中查找字符序列?

我知道'strtr'和'find',问题是函数需要能够找到一个字符串中的SPLIT序列。

鉴于字符串'Hello World',我需要一个函数,如果序列'H-W-l'存在,则返回true。有什么可以处理这个的预构建?

+1

[regex](http://en.cppreference.com/w/cpp/regex)库。 – user657267 2014-09-30 00:13:00

回答

2

就我所知,子序列搜索本身不是标准C库或标准C++库的一部分。

但是,您可以将子序列搜索表达为正则表达式或“glob”。 Posix强制使用regex和glob匹配函数,而C++标准库包含自C++ 11以来的正则表达式。这两种方法都需要修改搜索字符串:

  1. 正则表达式:HWlH.*W.*lregexec将搜索正则表达式(除非锚定,这不是这个);在C++中,您希望使用std::regex_search而不是std::regex_match

  2. Glob:HWl*H*W*l*。全局匹配总是完全匹配,尽管在我所知道的所有实现中,尾部*都已优化。这可在Posix标题fnmatch.h中作为fnmatch函数获得。对于此应用程序,请为flags参数提供0

如果你不喜欢任何上述情况,你可以在一个简单的循环使用标准C strchr功能:

bool has_subsequence(const char* haystack, const char* needle) { 
    const char* p; 
    for (p = haystack; *needle && (p = strchr(p, *needle)); ++needle) { 
    } 
    return p != NULL; 
} 
0

如果我理解正确的话,那么你想搜索为char s以给定的顺序,但不一定是连续的。如果您使用C++,我不明白为什么您不能使用<algorithm>系统标头下的std::find功能。我都加载到一个字符串,然后搜索如下:

bool has_noncontig_sequence(const std::string& str, const std::string& subStr) 
{ 
    typedef std::string::const_iterator iter; 
    iter start = str.begin(); 

    // loop over substr and save iterator position; 
    for (iter i = subStr.begin(); i != subStr.end(); ++i) 
     start = std::find(start, str.end(), *i); 

    // check position, if at end, then false; 
    return start != str.end() ? true : false; 
} 

std::find功能将在str定位start在第一正确的字符,如果能找到它,然后搜索下一个。如果不能,则start将被放置在最后,表示失败。