虽然正则表达式早已横行天下,但在文件路径匹配中通配符仍然非常有效。通配符的语法非常简单:*表示任何字符任何多个,?表示任何字符最多一个。不过在Win控制台语法中*可以跨扩展名匹配,而?不可以跨过扩展名分界线“.”。
通配符的实现有很多种,CodeProject上有一篇《Wildcard string compare (globbing)》。我这里用正则表达式来实现,通过对通配符字符串进行加工,而后构造正则来进行匹配。代码贴上:
/// <summary>
/// 将通配符字符串转换成等价的正则表达式
/// 这可以用正则表达式来实现通配符匹配
/// </summary>
/// <see cref="http://dearymz.blog.163.com/blog/static/205657420081122103757583/">《C#正则转义》</see>
/// <see cref="http://dearymz.blog.163.com/blog/static/2056574200722355218155/">《C#实现DOS通配符“*”和“/”的识别》</see>
static string GetWildcardRegexString(string wildcardStr)
{
Regex replace = new Regex("[.$^{\\[(|)*+?\\\\]");
return replace.Replace(wildcardStr,
delegate(Match m)
{
switch (m.Value)
{
case "?":
return ".?";
case "*":
return ".*";
default:
return "\\" + m.Value;
}
});
}
let GetWildcardRegexString wildcardStr =
(new Regex "[.$^{\\[(|)*+?\\\\]").Replace(wildcardStr,
(fun (m:Match) ->
match m.Value with
| "?" -> ".?"
| "*" -> ".*"
| _ -> "\\" + m.Value))
评论