我需要一个函数来识别另一个字符串中的模式字符串,同时考虑通配符_
例如,如果给定的模式是f__h
,那么它应该匹配到字符串catfish
。
所以本质上,下划线需要能够代表任何字母字符,但我想不出办法来解决这个问题。有人对如何做到这一点有一些想法吗?
谢谢。
我需要一个函数来识别另一个字符串中的模式字符串,同时考虑通配符_
例如,如果给定的模式是f__h
,那么它应该匹配到字符串catfish
。
所以本质上,下划线需要能够代表任何字母字符,但我想不出办法来解决这个问题。有人对如何做到这一点有一些想法吗?
谢谢。
使用新标准 C++11,您可以使用regex。否则使用boost regex。
有什么问题:
std::search(
text.begin(), text.end(),
pattern.begin(), pattern.end(),
[]( char fromText, char fromPattern ) {
return fromPattern == '_' || fromPattern == fromText;
} )
如果函数返回text.end()
,则不匹配。否则,它将返回匹配的第一个字符的迭代器。
如果您不介意 C 风格的解决方案,这对我有用:
#include <stdio.h>
#include <string.h>
const char * wildcard_strstr(const char * haystack, const char * needle)
{
int needleLen = strlen(needle);
while(*haystack)
{
const char * needleP = needle;
const char * haystackP = haystack;
bool match = true;
while((*needleP)&&(*haystackP)&&((*needleP == *haystackP)||(*needleP == '_')))
{
needleP++;
haystackP++;
}
if ((needleP-needle) == needleLen) return haystack;
else haystack++;
}
return NULL;
}
int main(int, char **)
{
while(1)
{
char haystack[512];
printf("Input haystack: "); fflush(stdout);
fgets(haystack, sizeof(haystack), stdin);
haystack[strlen(haystack)-1] = '\0'; // trim newline
char needle[512];
printf("Input needle: "); fflush(stdout);
fgets(needle, sizeof(needle), stdin);
needle[strlen(needle)-1] = '\0'; // trim newline
const char * match = wildcard_strstr(haystack, needle);
printf("\nNeedle [%s] %s in haystack [%s]\n", needle, match?"IS":"IS NOT", haystack);
if (match) printf(" returned match position is %p [%s]\n", match, match);
}
}