正则表达式在OpenFileDialog过滤字符串中找到第一个扩展名

时间:2013-04-05 05:43:18

标签: .net regex vb.net winforms .net-2.0

我想找到OpenFileDialog文件过滤器字符串中exentions列表中的第一个扩展名。

考虑以下示例 -

Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF

Text files (*.txt)|*.txt

对于第一种情况 - 现在如果用户尝试保存没有扩展名的文件,那么默认情况下我想将.BMP扩展名附加到文件名。

对于第二种情况 - 现在如果用户尝试保存没有扩展名的文件,那么默认情况下我想将.txt扩展名附加到文件名。

3 个答案:

答案 0 :(得分:3)

您在SaveFileDialog上有一个属性,可以将扩展名附加到无扩展名称文件,请查看MSDN Documentation

myOpenFile.DefaultExt = ".bmp"

无论如何,你可以得到像这样的过滤器的第一个扩展:

Dim sExt As String = sFilter.Split("|"c)(1).Split(";"c)(0)

然后您需要以您希望的方式清除*,例如:

  • sExt = sExt.Replace("*","")
  • sExt = sExt.SubString(sExt.LastIndexOf("."c))

我建议您使用第二个示例,因为即使过滤器没有*并且具有更多特定文件名,它也会获得扩展名。

答案 1 :(得分:1)

不是使用正则表达式来分割字符串,而是使用SysDragon建议的分割函数 - 没有理由不这样做。获得原始字符串的第二部分之后,此正则表达式将从BMP获取*.BMP;*.JPG;*.GIF作为唯一匹配。

^\|\*\.(\w{1,4});

简单地说,这说明如下:

  • ^ 从字符串的开头
  • 开始
  • \ | 找到一个竖线字符(\ n分隔它,因为这相当于正则表达式中的OR)
  • \ * 查找单个*字符(再次分隔,因为*表示正则表达式中的“零次或多次重复”)
  • \。查找单个句点(分隔符,因为这通常意味着“任何字符”)
  • (\ w {1,4})查找至少1个,最多4个字母数字字符。这是一个捕获组,因此您可以从匹配对象中获取它。
  • ; 查找分号

我随意选择了1-4个字母数字字符,但你可以调整它以满足你的需要,例如{3}意味着'找到正好三个',[A-Za-z]{1,3}意味着'找到至少一个和最多三个来自字母AZ和a-z'的匹配。

由于您只需要第一个扩展名,因此您可以按照自己的意愿进行操作,但您可以随时修改模式以将所有扩展名作为匹配集合。事实上,正则表达式甚至更简单(但是为什么返回 n 匹配1时会做什么?)并且我会为你做一个学习练习: - )

答案 2 :(得分:0)

我使用了两个不同的正则表达式来完成任务。我使用的第一个正则表达式是

(?<Name>[^|]*)\|(?<Extension>[^|]*)\|?

打破名称和文件的表达

Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF

分为两部分

  • Image Files(*.BMP;*.JPG;*.GIF)
  • *.BMP;*.JPG;*.GIF

然后我使用了正则表达式

\*\.(?<Name>[^;]\w*)

在第一个正则表达式组的Entension部分,以获取更多组,例如BMPJPGGIF,然后进行第一组匹配。我非常感谢Steve Pettifer鼓励他使用Expresso