3

我需要一个函数来识别另一个字符串中的模式字符串,同时考虑通配符_

例如,如果给定的模式是f__h,那么它应该匹配到字符串catfish

所以本质上,下划线需要能够代表任何字母字符,但我想不出办法来解决这个问题。有人对如何做到这一点有一些想法吗?

谢谢。

4

3 回答 3

3

使用新标准 C++11,您可以使用regex。否则使用boost regex

于 2013-10-17T15:30:07.523 回答
1

有什么问题:

std::search(
    text.begin(), text.end(),
    pattern.begin(), pattern.end(),
    []( char fromText, char fromPattern ) {
        return fromPattern == '_' || fromPattern == fromText;
    } )

如果函数返回text.end(),则不匹配。否则,它将返回匹配的第一个字符的迭代器。

于 2013-10-17T16:05:32.533 回答
0

如果您不介意 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);
   }
}
于 2013-10-17T15:45:30.187 回答