在开发中常碰到允许用户输入一个通配符,然后按照通配符来查找文件。我在.Net的类里面没有找到匹配通配符的类,所以写了一个函数来将输入的通配符转换成正则表达式。
static
string
ChangePattern(
string
reg)
... {
const string specialChars = @".$^{[(|)+";
StringBuilder sb = new StringBuilder();
sb.Append('^');
foreach (char ch in reg.ToCharArray())
...{
if (specialChars.IndexOf(ch) >= 0)
...{
sb.Append('/');
sb.Append(ch);
}
else if (ch == '*')
...{
sb.Append(".*");
}
else if (ch == '?')
...{
sb.Append(".{1}");
}
else
sb.Append(ch);
}
sb.Append('$');
return sb.ToString();
}
... {
const string specialChars = @".$^{[(|)+";
StringBuilder sb = new StringBuilder();
sb.Append('^');
foreach (char ch in reg.ToCharArray())
...{
if (specialChars.IndexOf(ch) >= 0)
...{
sb.Append('/');
sb.Append(ch);
}
else if (ch == '*')
...{
sb.Append(".*");
}
else if (ch == '?')
...{
sb.Append(".{1}");
}
else
sb.Append(ch);
}
sb.Append('$');
return sb.ToString();
}
这个函数的用法如下:
using
System;
using System.Text;
using System.Text.RegularExpressions;
namespace SpringLiu
... {
class Program
...{
static void Main(string[] args)
...{
string pattern = "*.tx?";
pattern = ChangePattern(pattern);
Regex reg = new Regex(pattern);
string[] names = ...{"hello.txt", "hello.txx", "hello.ext"};
foreach (string name in names)
...{
Console.WriteLine("{0} match {1} : {2}", name, pattern, reg.Match(name).Success);
}
}
static string ChangePattern(string reg)
...{
const string specialChars = @".$^{[(|)+";
StringBuilder sb = new StringBuilder();
sb.Append('^');
foreach (char ch in reg.ToCharArray())
...{
if (specialChars.IndexOf(ch) >= 0)
...{
sb.Append('/');
sb.Append(ch);
}
else if (ch == '*')
...{
sb.Append(".*");
}
else if (ch == '?')
...{
sb.Append(".{1}");
}
else
sb.Append(ch);
}
sb.Append('$');
return sb.ToString();
}
}
}
using System.Text;
using System.Text.RegularExpressions;
namespace SpringLiu
... {
class Program
...{
static void Main(string[] args)
...{
string pattern = "*.tx?";
pattern = ChangePattern(pattern);
Regex reg = new Regex(pattern);
string[] names = ...{"hello.txt", "hello.txx", "hello.ext"};
foreach (string name in names)
...{
Console.WriteLine("{0} match {1} : {2}", name, pattern, reg.Match(name).Success);
}
}
static string ChangePattern(string reg)
...{
const string specialChars = @".$^{[(|)+";
StringBuilder sb = new StringBuilder();
sb.Append('^');
foreach (char ch in reg.ToCharArray())
...{
if (specialChars.IndexOf(ch) >= 0)
...{
sb.Append('/');
sb.Append(ch);
}
else if (ch == '*')
...{
sb.Append(".*");
}
else if (ch == '?')
...{
sb.Append(".{1}");
}
else
sb.Append(ch);
}
sb.Append('$');
return sb.ToString();
}
}
}
输出如下:
hello.txt match ^.*/.tx.{1}$ : True
hello.txx match ^.*/.tx.{1}$ : True
hello.ext match ^.*/.tx.{1}$ : False