预建函数,用于查找字符串中的字符序列

Prebuilt function to find character sequence in a string?

本文关键字:字符 字符串 查找 函数 用于      更新时间:2023-10-16

我正在处理一个多线程项目,对于项目的一个片段,我需要查找字符串中是否存在给定的字符序列。我想知道C++/C是否有任何预构建的函数可以处理这个问题,但我很难弄清楚要搜索的确切"定义"。

我知道"strtr"answers"find",问题是函数需要能够找到一个在字符串中拆分的序列。

给定字符串"Hello World",如果序列"H-W-l"存在,我需要一个返回true的函数。有什么预先构建的东西可以处理这个问题吗?

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

但是,您可以将子序列搜索表示为正则表达式或"glob"。Posix同时要求regex和glob匹配函数,而C++标准库自C++11以来就包含正则表达式。这两种技术都需要修改搜索字符串:

  1. 正则表达式:HWl⇒CCD_ 2。regexec将搜索正则表达式(除非锚定,否则此表达式不是锚定的);在C++中,您可能希望使用std::regex_search而不是std::regex_match

  2. 球:HWl*H*W*l*。全局匹配总是完全匹配的,尽管在我所知道的所有实现中,后面的*都经过了优化。这可用作Posix标头fnmatch.h中的fnmatch函数。对于此应用程序,请为flags参数提供0

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

如果我理解正确,那么您正在尝试按给定顺序搜索char,但不一定是连续的。如果您使用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函数将把start定位在str中的第一个正确字符上(如果它能找到),然后搜索下一个。如果不能,则start将被定位在末尾,表示失败。