可能重复:
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#
答案 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
语句添加.
,表示*
运算符前面的任何字符,表示或更多重复。上面的代码分别产生True
和False
。
编辑:如上所述,您需要根据您的情况转义更多字符。
编辑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);