顺利找到工作之后,每天勤勤恳恳的上班中...
项目需要搜索含有通配符的文件名的文件,*号表示任意多字符。这里应该只处理英文。
如此简单的要求,还是不要用正则表达式,一是简单,而是正则表达式感觉杀鸡用了牛刀了。
只含有*号的情况就简单的很了,*号匹配任意多字符,首先还是着眼于非*号的文字。
比如 :
abcdefg 匹配 a*d*g,这是个通用的匹配,它过了,也就都过了。
很显然,a应该在开头,g应该在结尾。两个函数StartWith和EndWith,就绝对的保证了开头和结尾。
中间,随便匹配一下,也就ok了,鉴于 a*c*e*g形式的存在,匹配还是应该按顺序来。而不是掐头去尾再搜索一下。
第一步,把a*c*e*g split数组 [a,c,e,g]
第二步,匹配第一个a,找到之后,将原字符串截掉a 的到bcdefg.
第三步, 匹配c 这里用IndexOf ,找到c的位置,把 c前面的都干掉 得到 defg
第四步,找到e的位置,同样干掉前面一节,得到fg。
这时候只剩下g一个匹配项目了,直接endwith即可。
中间任何一步匹配失败,则整体失败。
发个代码,小心了(代码害人):
private bool IsMatch(string src,stringpattern)
{string[] ps = pattern.Split('*');for(int i = 0; i < ps.Length; i++)
{if(i == 0)
{if(src.StartsWith(ps[i]))
{
src=src.Substring(ps[i].Length);
}
}else if (i == ps.Length-1)
{if(src.EndsWith(ps[i]))
{return true;
}
}else{int p =src.IndexOf(ps[i]);if (p == -1)
{return false;
}else{
src= src.Substring(p +ps[i].Length);
}
}
}return false;
}