65.9K
CodeProject 正在变化。 阅读更多。
Home

字符串通配符匹配(* 和 ?)

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (9投票s)

2007年7月22日

CPOL
viewsIcon

64605

一个简单的函数, 用于执行通配符(* ? ) 字符串匹配

引言

我遇到了一个问题,需要根据通配符(* 和 ?)来匹配一个字符串与模式。本文中介绍的函数是一个简单的实现,用于进行这种匹配。以下是一些示例模式:

  • sam*
  • sam*e
  • samp?e
  • s*p?e
  • 等等。

Using the Code

该函数的用法非常简单。只需使用两个参数调用该函数即可。第一个参数是要与第二个参数中指定的模式进行比较的字符串。该函数不执行任何错误检查。

//
//  

bool pattern_match(const char *str, const char *pattern) {
    enum State {
        Exact,      	// exact match
        Any,        	// ?
        AnyRepeat    	// *
    };

    const char *s = str;
    const char *p = pattern;
    const char *q = 0;
    int state = 0;

    bool match = true;
    while (match && *p) {
        if (*p == '*') {
            state = AnyRepeat;
            q = p+1;
        } else if (*p == '?') state = Any;
        else state = Exact;

        if (*s == 0) break;

        switch (state) {
            case Exact:
                match = *s == *p;
                s++;
                p++;
                break;

            case Any:
                match = true;
                s++;
                p++;
                break;

            case AnyRepeat:
                match = true;
                s++;

                if (*s == *q) p++;
                break;
        }
    }

    if (state == AnyRepeat) return (*s == *q);
    else if (state == Any) return (*s == *p);
    else return match && (*s == *p);
} 

历史

  • 2007年7月22日:初始发布
© . All rights reserved.