*?通配符

通配符*表示匹配任何内容,但是不能匹配空的内容
通配符?表示匹配任何内容,包含空的内容
例如”*线”可以匹配”进线”或者”出线”但是不能匹配”线”
“?线”可以匹配”进线”或者”出线”也同时能匹配”线”

//GStringMatch.h
#pragma once

class GStringMatch
{
public:
 GStringMatch(void);
public:
 ~GStringMatch(void);
 //是否匹配
 //str是否符合strMatch的描述
 bool IsMatch(CString str,CString strMatch);
 bool m_bIngoreCase;//忽略大小写
private:
 bool IsMatch(CString str,CStringArray& strMatchArray);
};

//GStringMatch.cpp
#include “StdAfx.h”
#include “GStringMatch.h”

GStringMatch::GStringMatch(void)
{
 m_bIngoreCase=true;
}

GStringMatch::~GStringMatch(void)
{
}
//是否匹配
bool GStringMatch::IsMatch(CString str,CString strMatch)
{
 if(str.IsEmpty())
 {
  return false;
 }
 if(strMatch.IsEmpty())
 {
  return false;
 }
 if(m_bIngoreCase)
 {
  //忽略大小写
  str.MakeUpper();
  strMatch.MakeUpper();
 }
 CStringArray strMatchArray;
 CString strTmp=_T(“”);
 for(int i=0;i<strMatch.GetLength();i++)
 {
  TCHAR c=strMatch.GetAt(i);
  if(c==_T(‘*’))
  {
   if(!strTmp.IsEmpty())
   {
    strMatchArray.Add(strTmp);
    strTmp=_T(“”);
   }
   if(strMatchArray.GetCount()==0)
   {
    strMatchArray.Add(_T(“*”));
   }
   else
   {
    if(strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“*”))!=0&&
     strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“?”))!=0)
    {
     //两个连续的*号没有意义
     //*?也是没有意义的
     strMatchArray.Add(_T(“*”));
    }
   }
  }
  else if(c==_T(‘?’))
  {
   if(!strTmp.IsEmpty())
   {
    strMatchArray.Add(strTmp);
    strTmp=_T(“”);
   }
   if(strMatchArray.GetCount()==0)
   {
    strMatchArray.Add(_T(“?”));
   }
   else
   {
    if(strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“*”))!=0&&
     strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“?”))!=0)
    {
     strMatchArray.Add(_T(“?”));
    }
    else if(strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“*”))==0)
    {
     //*?其实相当于?
     strMatchArray.SetAt(strMatchArray.GetCount()-1,_T(“?”));
    }
    else if(strMatchArray.GetAt(strMatchArray.GetCount()-1).Compare(_T(“?”))==0)
    {
     //??相当于?
    }
   }
  }
  else
  {
   strTmp+=c;
   if(i==strMatch.GetLength()-1)
   {
    strMatchArray.Add(strTmp);
   }
  }
 }
 if(strMatchArray.GetCount()==0)
 {
  return false;
 }
 return IsMatch(str,strMatchArray);
}
bool GStringMatch::IsMatch(CString str,CStringArray& strMatchArray)
{
 if(strMatchArray.GetCount()==0)
 {
  if(str.IsEmpty())
  {
   return true;
  }
  else
  {
   return false;
  }
 }
 CString strMatch0=strMatchArray.GetAt(0);
 if(strMatch0.CompareNoCase(_T(“*”))==0)
 {
  if(strMatchArray.GetCount()==1)
  {
   if(str.IsEmpty())
   {
    return false;
   }
   else
   {
   return true;
   }
  }
  CString strMatch1=strMatchArray.GetAt(1);
  int nIndex=str.Find(strMatch1);
  if(nIndex<0)
  {
   return false;
  }
  if(nIndex==0)
  {
   //*不能匹配空内容
   return false;
  }
  int nLen=str.GetLength()-(nIndex+strMatch1.GetLength());
  str=nLen>0?str.Right(nLen):_T(“”);
  strMatchArray.RemoveAt(0);
  strMatchArray.RemoveAt(0);
  return IsMatch(str,strMatchArray);

 }
 else if(strMatch0.CompareNoCase(_T(“?”))==0)
 {
  if(strMatchArray.GetCount()==1)
  {
   return true;
  }
  CString strMatch1=strMatchArray.GetAt(1);
  int nIndex=str.Find(strMatch1);
  if(nIndex<0)
  {
   return false;
  }
  int nLen=str.GetLength()-(nIndex+strMatch1.GetLength());
  str=nLen>0?str.Right(nLen):_T(“”);
  strMatchArray.RemoveAt(0);
  strMatchArray.RemoveAt(0);
  return IsMatch(str,strMatchArray);
 }
 else
 {
  if(str.GetLength()<strMatch0.GetLength())
  {
   return false;
  }
  CString str0=str.Left(strMatch0.GetLength());
  if(str0.Compare(strMatch0)!=0)
  {
   return false;
  }
  int nLen=str.GetLength()-strMatch0.GetLength();
  str=nLen>0?str.Right(nLen):_T(“”);
  strMatchArray.RemoveAt(0);
  return IsMatch(str,strMatchArray);
 }
}

 

此条目发表在C++分类目录,贴了标签。将固定链接加入收藏夹。

发表评论