正则表达式的文件名

时间:2012-09-17 06:30:28

标签: c# regex

  

可能重复:
  How do I check if a filename matches a wildcard pattern

在我正在进行的程序中,用户有两个输入。

  

输入1 =文件名。
输入2 = flagFilePattern

     

离。 1
输入1 = file1.xml或file25.xml或file_123.xml
  输入2 =文件* .xml
结果(所有文件都应该匹配   模式(输入2)

     

离。 2
输入1 = file1.xml.done
输入2 =文件* .xml
  结果(文件不应该基于模式匹配,因为.xml   文件名的最后一个没有找到。)

问题,根据上面的例子我的正则表达式应该是什么?
注意:我的代码在C#

3 个答案:

答案 0 :(得分:1)

input 2的值可以是有效的正则表达式。您需要做的只是添加^$锚点,这些将允许您的正则表达式引擎专门匹配该模式,所以在您的情况下,您可以这样做:

 String input2 = "file*.xml";
        Regex regex = new Regex("^" + input2.Replace(".", "\\.").Replace("*",".*") + "$");
        String input1 = "file_123.xml";
        String input3 = "file_123.xml.done";

        System.Console.WriteLine(regex.IsMatch(input1));
        System.Console.WriteLine(regex.IsMatch(input3));
        System.Console.ReadLine();
...

.是正则表达式中的特殊字符,因此需要进行转义。第二个replace语句添加.,表示*运算符前面的任何字符,表示或更多重复。上面的代码分别产生TrueFalse

编辑:如上所述,您需要根据您的情况转义更多字符。

编辑2:下面的代码应该注意转义任何作为正则表达式语言一部分的字符串。在您的情况下,这也意味着*运算符。我使用Regex.Escape方法转义了可能具有特殊正则表达式含义的所有字符,然后使用通常的replace*回到正轨。

            String input2 = "file*.xml";
            input2 = Regex.Escape(input2);  //Yields file\\*\\.xml
            input2 = input2.Replace("\\*", ".*");  //Yields file.*\\.xml
            Regex regex = new Regex("^" + input2 + "$");
            String input1 = "file_123.xml";
            String input3 = "file_123.xml.done";

            System.Console.WriteLine(regex.IsMatch(input1));
            System.Console.WriteLine(regex.IsMatch(input3));
            System.Console.ReadLine();

答案 1 :(得分:1)

只需使用input2并将其转换为正确的模式,如

var regex = new Regex(@"\A" + (args[1].Replace(".", @"\.").Replace("*", ".*")) + @"\Z");

答案 2 :(得分:-1)

如果input 2始终是有效的正则表达式,则可以使用以下代码:

String regex = input2;

Pattern pattern = Pattern.compile(regex); 

Matcher matcher = pattern.matcher(input1);