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

时间:2012-10-02 19:10:14

标签: c# regex wildcard

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

例如,如果我的模式是*.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

这样的模式

1 个答案:

答案 0 :(得分:8)

那里有很多分组正在进行中并不是真的需要......除非有一些你没有提到的东西,否则这个正则表达式会以较少的方式做同样的事情:

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

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

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

如果你必须以编程方式在两者之间进行翻译,那么你已经开始了正确的轨道 - 用分号分割,将你的扩展分组到集合中(没有前面的点)。如果您的通配符模式可能更复杂(带通配符的扩展,多通配符启动匹配),则可能需要更多工作;)

编辑:(供您更新)

如果外卡可能更复杂,那么你几乎就在那里。在我的上面的代码中有一个优化,可以拉出点(对于扩展名),必须将其放回去,这样你最终会得到:

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

基本上'*' - > '。*','。' - > '\。'(得到逃脱),休息进入集合。基本上它表示在myfile.jpg.png.bmp中匹配任何结尾(美元符号锚定到结尾)。