Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件名的正则表达式_C#_Regex - Fatal编程技术网

C# 文件名的正则表达式

C# 文件名的正则表达式,c#,regex,C#,Regex,可能重复: 在我正在做的程序中,用户有两个输入 输入1=文件名。输入2=flagFilePattern 例1输入1=file1.xml或file25.xml或file_123.xml 输入2=文件*.xml结果所有文件应根据 模式输入2 例2输入1=file1.xml.done输入2=file*.xml 结果文件不应基于模式匹配,因为.xml 在文件名的最后一个位置找不到 问题,基于上面的例子,我的正则表达式应该是什么? 注意:我的代码在C中,如果输入2始终是有效的正则表达式,则可以使用以下代

可能重复:

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

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

例1输入1=file1.xml或file25.xml或file_123.xml 输入2=文件*.xml结果所有文件应根据 模式输入2

例2输入1=file1.xml.done输入2=file*.xml 结果文件不应基于模式匹配,因为.xml 在文件名的最后一个位置找不到

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

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

String regex = input2;

Pattern pattern = Pattern.compile(regex); 

Matcher matcher = pattern.matcher(input1); 
输入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语句添加了一个。表示*运算符前面的任何字符,表示一次或多次重复。上面的代码分别产生True和False

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

编辑2:下面的代码应该注意转义任何作为正则表达式语言一部分的字符串。在您的例子中,这也意味着*操作符。我使用Regex.Escape方法对所有可能具有特殊Regex含义的字符进行转义,然后使用通常的替换使*返回正轨

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

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

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

在本例中,Input2不是一个有效的正则表达式,它是有效的,但它不能按预期工作。它看起来很像一个地球仪。谢谢你的纠正。这个链接可能会帮助访问者:这里错了,因为*在他的演示中匹配了一些字符,但在regex中只有一个没有量词…@TheHe:是的,你说对了,现在应该修好了。那么他是说如果我使用,它会起作用。替换,[A-Za-z0-9]吧?哇。谢谢大家,我会立即尝试。@TimPietzcker不要让我们紧张,如果你知道怎么做,请提供100%完整的答案,而不是与我们对抗,因为我们想要帮助;我们正在等待一个100%的答案……这充其量是不完整的,充其量是误导性的。还有许多其他regex元字符需要转义,而您没有处理?在我看来,他只是想用*作为全局选择器,还有?其他元字符在普通文件名中不太常见……此外,在他的示例中,名称很清楚,问题不大?是一个全局元字符。您如何知道文件名不包含括号等?我不知道-只是提供了一个与上面示例完全匹配的答案。。。guy-我知道你在说什么,但这不是问题所在。-1不清楚你想验证什么,不清楚input2是否是动态的,不清楚input2是否应该始终是一个具有xml扩展名的文件名,也不清楚为什么你想在任务中使用正则表达式,而不仅仅是验证文件是否存在。