我正在进行多线程项目,如果字符串中存在给定的字符序列,我需要找到项目的一个部分。我想知道C ++ / C是否有任何预先构建的功能可以处理这个问题,但我很难搞清楚确切的定义'搜索。
我知道' strtr'并且'发现',问题是函数需要能够找到跨字符串SPLIT的序列。
鉴于字符串' Hello World',我需要一个函数,如果序列' H-W-1'存在。有什么预先构建可以处理这个吗?
答案 0 :(得分:2)
据我所知,子序列搜索不是标准C库或标准C ++库的一部分。
但是,您可以将子序列搜索表达为正则表达式或“glob”。 Posix强制要求使用正则表达式和全局匹配函数,而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;
}
答案 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
将定位在最后,表示失败。