-3

可能重复:
如何检查文件名是否与通配符模式匹配

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

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

前任。1
输入 1 = file1.xml 或 file25.xml 或 file_123.xml
输入 2 = file*.xml
结果(所有文件应根据模式匹配(输入 2)

前任。2
输入 1 = file1.xml.done
输入 2 = file*.xml
结果(文件不应根据模式匹配,因为在文件名的最后未找到 .xml)。

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

4

3 回答 3

1

for 的值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();
...

The.是正则表达式中的特殊字符,因此需要对其进行转义。第二个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();
于 2012-09-17T06:35:56.600 回答
1

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

var regex = new Regex(@"\A" + (args[1].Replace(".", @"\.").Replace("*", ".*")) + @"\Z");
于 2012-09-17T06:35:59.307 回答
-1

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

String regex = input2;

Pattern pattern = Pattern.compile(regex); 

Matcher matcher = pattern.matcher(input1); 
于 2012-09-17T06:33:58.773 回答