程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c說話完成的帶通配符婚配算法

c說話完成的帶通配符婚配算法

編輯:關於C++

c說話完成的帶通配符婚配算法。本站提示廣大學習愛好者:(c說話完成的帶通配符婚配算法)文章只能為提供參考,不一定能成為您想要的結果。以下是c說話完成的帶通配符婚配算法正文


原創代碼。

‘?'代表隨意率性單個字符,‘*'代表隨意率性0個或多個字符。經常使用於文件的搜素婚配。

bool MatchWithAsteriskW(wchar_t* str1, wchar_t* pattern)
{
  if (str1 == NULL) return false;
  if (pattern == NULL) return false;
  int len1 = lstrlenW(str1);
  int len2 = lstrlenW(pattern);
  int mark = 0;//用於分段標志,'*'分隔的字符串
  int p1 = 0, p2 = 0;
 
  while (p1<len1 && p2<len2)
  {
    if (pattern[p2] == '?')
    {
      p1++;
      p2++;
      continue;
    }
    if (pattern[p2] == '*')
    {
      /*假如以後是*號,則mark後面一部門曾經取得婚配,
      *從以後點開端持續下一個塊的婚配
      */
      p2++;
      mark = p2;
      continue;
    }
    if (str1[p1] != pattern[p2])
    {
      if (p1 == 0 && p2 == 0)
      {
        /*
        * 假如是首字符,特別處置,不雷同即婚配掉敗
        */
        return false;
      }
      /*
      * pattern: ...*bdef*...
      *       ^
      *       mark
      *        ^
      *        p2
      *       ^
      *       new p2
      * str1:.....bdcf...
      *       ^
      *       p1
      *      ^
      *     new p1
      * 如上表示圖所示,在比到e和c處不想等
      * p2前往到mark處,
      * p1須要前往到下一個地位。
      * 由於*前曾經取得婚配,所以mark打標之前的不須要再比擬
      */
      p1 -= p2 - mark - 1;
      p2 = mark;
      continue;
    }
    /*
    * 此處處置相等的情形
    */
    p1++;
    p2++;
  }
  if (p2 == len2)
  {
    if (p1 == len1)
    {
      /*
      * 兩個字符串都停止了,解釋形式婚配勝利
      */
      return true;
    }
    if (pattern[p2 - 1] == '*')
    {
      /*
      * str1還沒有停止,但pattern的最初一個字符是*,所以婚配勝利
      *
      */
      return true;
    }
  }
  while (p2<len2)
  {
    /*
    * pattern多出的字符只需有一個不是*,婚配掉敗
    *
    */
    if (pattern[p2] != '*')
      return false;
    p2++;
  }
  return true;
}

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved