我正在开发一个多线程项目,其中对于需要查找字符串中是否存在给定字符序列的项目的一个段。我想知道如果C++/C有任何预处理函数可以处理这个问题,但无法找出确切的'定义'来搜索。预编译函数在字符串中查找字符序列?
我知道'strtr'和'find',问题是函数需要能够找到一个字符串中的SPLIT序列。
鉴于字符串'Hello World',我需要一个函数,如果序列'H-W-l'存在,则返回true。有什么可以处理这个的预构建?
我正在开发一个多线程项目,其中对于需要查找字符串中是否存在给定字符序列的项目的一个段。我想知道如果C++/C有任何预处理函数可以处理这个问题,但无法找出确切的'定义'来搜索。预编译函数在字符串中查找字符序列?
我知道'strtr'和'find',问题是函数需要能够找到一个字符串中的SPLIT序列。
鉴于字符串'Hello World',我需要一个函数,如果序列'H-W-l'存在,则返回true。有什么可以处理这个的预构建?
就我所知,子序列搜索本身不是标准C库或标准C++库的一部分。
但是,您可以将子序列搜索表达为正则表达式或“glob”。 Posix强制使用regex和glob匹配函数,而C++标准库包含自C++ 11以来的正则表达式。这两种方法都需要修改搜索字符串:
正则表达式:HWl
⇒ H.*W.*l
。 regexec
将搜索正则表达式(除非锚定,这不是这个);在C++中,您希望使用std::regex_search
而不是std::regex_match
。
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;
}
如果我理解正确的话,那么你想搜索为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
将被放置在最后,表示失败。
[regex](http://en.cppreference.com/w/cpp/regex)库。 – user657267 2014-09-30 00:13:00