*?通配符
通配符*表示匹配任何内容,但是不能匹配空的内容 通配符?表示匹配任何内容,包含空的内容 例如"*线"可以匹配"进线"或者"出线"但是不能匹配"线" "?线"可以匹配"进线"或者"出线"也同时能匹配"线" //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); } }查看完整版本: *?通配符
Tags: 通配符