C# 文件名的正则表达式
可能重复: 在我正在做的程序中,用户有两个输入 输入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始终是有效的正则表达式,则可以使用以下代码: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始终是有效的正则表达式,则可以使用以下代
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扩展名的文件名,也不清楚为什么你想在任务中使用正则表达式,而不仅仅是验证文件是否存在。