将通配符模式转换为正则表达式

7

我对正则表达式还不熟悉。最近,我被分配了一个任务,需要将通配符模式转换为正则表达式。这将用于检查文件路径是否与正则表达式匹配。

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

我可以通过在分号上拆分、转义字符串并将转义的*替换为.*来生成正则表达式。

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

因此,我的最终正则表达式将是针对jpg的((?i).*\.jpg)$)。然后,我使用OR运算符结合所有扩展名。

因此,对于此示例,我的最终表达式将是:

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

我已经测试过它可以正常工作,但我不确定是否需要添加或删除任何表达式以涵盖其他情况,或者是否有更好的格式整合整个内容。
另外请注意,我可能会遇到通配符,例如*myfile.jpg,它应该匹配所有文件名以myfile.jpg结尾的文件。
我可能会遇到像*myfile.jpg;*.png;*.bmp这样的模式。

你也可以尝试访问codereview.se。 - Sam Axe
2
我发现使用http://refiddle.com/非常有用,可以测试正则表达式。 - jussinen
我一直在测试我的表达式,但是如果你有一种感觉缺少了什么或者过度思考了问题,那么测试可能会成为一个问题。 - Zaid Amir
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结尾的任何内容(美元符号将锚定到结尾)。

文件名怎么办,例如使用通配符myfile.jpg。假设这样的模式myfile.jpg;*.png。 - Zaid Amir
我修改了问题,很抱歉我没有第一时间提到最后一个问题。那么你的表达式能否被修改以包括这种情况? - Zaid Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接