由于项目需要,最近写了一个模式匹配算法,支持%(代表一个或者任意个字符),_(代表一个字符)通配符号,自己在vc6下测试通过.
bool regexMatch(unsigned char* des ,int desLen ,unsigned char* source)
{
int len = 0 ;
unsigned char* tempSou = 0 ;
unsigned char* tempDes = 0 ;
int oldLoc ;// if it does not match , it will go back old location to found match word
if (source == 0 || desLen == 0)
{
return false;
}
while(len < desLen)
{
if(*source == 0 && tempSou != 0) //if the target go to the end , go to the first % to continue to match
{
source = tempSou;
des = tempDes++;
len = oldLoc++;
}
else if (*source == '%')
{
tempDes = des;
oldLoc = len;
while(*source == '%') // if there are
{
source++;
tempSou = source;
if (*source == 0) //if the source is over with * , the source must match the destination string
{
return true;
}
}
}
else if ( *source == *des || *source == '_') //match ,go next
{
source ++ ;
des ++ ;
len ++ ;
if ( *source == 0 && len == desLen) // if match to the end of both
{
return true ;
}
}
else // there are words not match
{
if (tempSou == 0 )
{
return false ;
}
source = tempSou;
len = oldLoc + 1 ;
des = tempDes + 1;
while(len < desLen) // get the location of the next matching
{
if (*source == '_' || *des == *source)
{
tempDes = des;
oldLoc = len;
break;
}
len ++ ;
des ++ ;
}
}
}
if (*source) // if there are left % for example abc%%%%%
{
while(*source)
{
if (*source != '%')
{
return false;
}
source ++ ;
}
return true;
}
return false ;
}
测试:
abc
abc
true
abc
asdfsaf
false
safdasfasfasf
%
true
safdasfasfasf
_____________
true
safdasfasfasf
s%fa%
true
safdasfasfasf
s%fas%_f
true
ccccccc
c%cc%cc%c
true
ccccccc
c_%_%
true
ccccccc
c_c_c_c_%
false
ccccccc
c_c_c_c%%%
true
ccccccc
%%%%%%%%%%%%%%%%%%%%
true
asdfasfafahgdsfjkal;fjda;
a_s_a%;fj%_;
false
asdfasfafahgdsfjkal;fjda;
a_s_a%;fj%;
false
asdfasfafahgdsfjkal;fjda;
a%s_a%;fj%_;
true