【问题标题】:Prebuilt function to find character sequence in a string?预建函数来查找字符串中的字符序列?
【发布时间】:2014-09-30 00:08:48
【问题描述】:
我正在处理一个多线程项目,对于项目的一个部分,我需要查找字符串中是否存在给定的字符序列。我想知道 C++/C 是否有任何可以处理这个问题的预建函数,但是在找出要搜索的确切“定义”时遇到了麻烦。
我知道“strtr”和“find”,问题是函数需要能够找到一个跨字符串拆分的序列。
给定字符串“Hello World”,如果存在序列“H-W-l”,我需要一个返回 true 的函数。有什么预建的可以处理这个吗?
【问题讨论】:
标签:
c++
string
find
character
sequence
【解决方案1】:
据我所知,子序列搜索本身既不是标准 C 库也不是标准 C++ 库的一部分。
但是,您可以将子序列搜索表示为正则表达式或“glob”。 Posix 要求正则表达式和 glob 匹配函数,而 C++ 标准库包含自 C++11 以来的正则表达式。这两种技术都需要修改搜索字符串:
正则表达式:HWl ⇒ H.*W.*l。 regexec 将搜索正则表达式(除非锚定,这个不是);在 C++ 中,您可能希望使用 std::regex_search 而不是 std::regex_match。
全局: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;
}
【解决方案2】:
如果我理解正确,那么您正在尝试按给定顺序搜索chars,但不一定是连续的。如果您使用 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会被定位到最后,表示失败。