zoukankan      html  css  js  c++  java
  • directory searchPattern to regex pattern

    当使用Directory.GetFiles(string path, string searchPattern) 获取文件列表后,需要在已存在的文件名列表找出满足同样模式的文件来比较,此时需要一个regex pattern来进行匹配查找, 当只有已存在的 searchPattern,那怎样将Directory searchPattern 转化到 regex pattern呢?

    Example:

    search pattern:
    data2010*.dat 

    result of Directory.GetFiles
    data20100001.dat
    data20100002.dat
    data20100003.dat
    existing file name list:
    data20090001.dat
    data20090002.dat
    data20090003.dat
    data20100001.dat
    data20100002.dat
    data20100003.dat

    the regex pattern to match file name

    data20100001.dat
    data20100002.dat
    data20100003.dat

     

    Step:

    searchPattern=data2010*.dat

     

    escape:data2010\*\.dat

    replace:data2010.\.dat

    post process:^data2010.\.dat$

     

    regexpatter:^data2010.\.dat$

     

    SimpleCode:

               string searchPattern = "data2010*.dat";
               searchPattern = Regex.Escape(searchPattern);
               Console.WriteLine(searchPattern);
               searchPattern = searchPattern.Replace(@"\?", ".").Replace(@"\*", @".*");
               Console.WriteLine(searchPattern);
               string prefix = "^";
               string sufix = "$";
               if (false) //optional
               {
                   prefix = string.Empty;
               }

               if (false) //optional
               {
                   sufix = string.Empty;
               }
               searchPattern = string.Format("{0}{1}{2}", prefix, searchPattern, sufix);
               Console.WriteLine(searchPattern);

    Output:

    data2010*.dat
    data2010\*\.dat
    data2010.*\.dat
    ^data2010.*\.dat$

     

    Regex.Escape功能:

    通过将最少量的一组字符(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)替换为其转义码,将这些字符转义。此操作指示正则表达式引擎以字面意义而非按元字符解释这些字符。

     

    注意:

    searchPattern在Directory.GetFiles会有一些不同的表现如下,所以会得到额外的文件,此时需要对得到的文件名进行过滤,此时也可使用这种方式来过滤, 例如在replace中加入更强的限制。

     

    escape:data2010\*\.dat

    replace:data2010.\.dat

    post process:^data2010.\.dat$

    Directory.GetFiles(string path, string searchPattern)

    说明

    在 searchPattern 中使用星号通配符时(如“*.txt”),扩展名长度正好为三个字符时的匹配行为与扩展名长度多余或少于三个字符时的匹配行为不同。文件扩展名正好是三个字符的 searchPattern 将返回扩展名为三个或更多字符的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。文件扩展名为一个、两个或三个以上字符的 searchPattern 仅返回扩展名长度正好与 searchPattern 中指定的文件扩展名匹配的文件。使用问号通配符字符时,此方法仅返回与指定文件扩展名匹配的文件。例如,假设目录下有两个文件“file1.txt”和“file1.txtother”,使用“file?.txt”搜索模式时只返回第一个文件,而使用“file*.txt”搜索模式时会同时返回这两个文件。

    说明

    因为此方法仅检查同时具有 8.3 文件名格式和长文件名格式的文件,类似“*1*.txt”的搜索模式可能会返回意外的文件名。例如,使用“*1*.txt”的搜索模式将返回“longfilename.txt”,因为等效的 8.3 文件名格式为“LONGFI~1.TXT”。

     

    Reference:

    Regex.Escape:

    http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.escape.aspx

    Directory.GetFiles

    http://msdn.microsoft.com/zh-cn/library/wz42302f.aspx

  • 相关阅读:
    【Java】增强的for流程
    xxxxx
    lyphtesttest rename of file
    lyphtesttest winmerge class の比較
    lyphtesttest sql of system session
    lyphtesttest 常用ファイルの操作、検索。excelの操作  java
    Maven3(2.集成maven插件到eclipse(包含eclipse安装svn步骤))
    Maven3(1.下载maven安装与配置)
    centos6 安装hbase+hadoop单机版
    centos6 安装jdk1.6
  • 原文地址:https://www.cnblogs.com/zzj8704/p/1831739.html
Copyright © 2011-2022 走看看