预建函数在字符串中查找字符序列?

时间:2014-09-30 00:08:48

标签: c++ string find character sequence

我正在进行多线程项目,如果字符串中存在给定的字符序列,我需要找到项目的一个部分。我想知道C ++ / C是否有任何预先构建的功能可以处理这个问题,但我很难搞清楚确切的定义'搜索。

我知道' strtr'并且'发现',问题是函数需要能够找到跨字符串SPLIT的序列。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

  2. 全球:HWl*H*W*l*。全局匹配始终是完全匹配,但在所有实现中,我知道尾随*已经过优化。这可以作为Posix标题fnmatch.h中的fnmatch函数使用。对于此应用程序,请为flags参数提供0

  3. 如果你不喜欢上述任何一种,你可以在一个简单的循环中使用标准的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;
    }
    

答案 1 :(得分:0)

如果我理解正确,那么您尝试按给定顺序搜索char,但不一定是连续的。如果您使用的是C ++,我就不明白为什么您无法使用std::find系统标题下的<algorithm>功能。我会将两者加载到一个字符串中,然后搜索如下:

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函数会将start置于str中的第一个正确字符上,如果它可以找到它,然后搜索下一个字符。如果不能,则start将定位在最后,表示失败。