5

我是正则表达式的新手。最近,我收到了一项将通配符模式转换为正则表达式的任务。这将用于检查文件路径是否与正则表达式匹配。

例如,如果我的模式是 *.jpg;*.png;*.bmp

我能够通过拆分分号、转义字符串并将转义的*替换为.*

String regex = "((?i)" + Regex.Escape(extension).Replace("\\*", ".*") + "$)";

所以我得到的正则表达式将用于 jpg ((?i).*\.jpg)$) Thien 我使用 OR 运算符组合我的所有扩展。

因此,我对这个例子的最终表达将是:

((?i).*\.jpg)$)|((?i).*\.png)$)|((?i).*\.bmp)$)

我已经对其进行了测试并且它有效但我不确定是否应该添加或删除任何表达式以涵盖其他情况,或者是否有更好的格式

另请记住,我可能会遇到通配符*myfile.jpg,例如它应该匹配名称以 myfile.jpg 结尾的所有文件

我可以遇到像这样的模式*myfile.jpg;*.png;*.bmp

4

1 回答 1

8

那里有很多分组,实际上并不需要......好吧,除非你没有提到这个正则表达式会做同样的事情更少:

 /.*\.(jpg|png|bmp)$/i

那是正则表达式,在 C# 中是:

String regex=new RegEx(@".*\.(jpg|png|bmp)$",RegexOptions.IgnoreCase);

如果您必须以编程方式在两者之间进行转换,那么您已经开始走上正确的道路 - 用分号分隔,将您的扩展分组到集合中(没有前面的点)。如果您的通配符模式可能更复杂(使用通配符的扩展、多通配符开始匹配),它可能需要更多的工作;)

编辑:(供您更新)

如果通配符可以更复杂,那么你就快到了。我上面的代码中有一个优化,它把点拉出来(用于扩展),必须放回去,所以你最终会得到:

 /.*(myfile\.jpg|\.png|\.bmp)$/i

基本上 '*' -> '.*', '.' -> '\.'(被转义),其余进入集合。基本上它说匹配任何结尾(美元符号锚定到结尾)myfile.jpg.png.bmp

于 2012-10-02T19:15:56.140 回答