将通配符*和?处理成正则表达式

 在开发中常碰到允许用户输入一个通配符,然后按照通配符来查找文件。我在.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();
        }

 

这个函数的用法如下:

 

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();
        }



    }

}

 

输出如下:

hello.txt match ^.*/.tx.{1}$ : True
hello.txx match ^.*/.tx.{1}$ : True
hello.ext match ^.*/.tx.{1}$ : False

阅读更多

没有更多推荐了,返回首页