-2

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

考虑下面的例子 -

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

Text files (*.txt)|*.txt

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

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

4

3 回答 3

3

您有一个属性SaveFileDialog可以将扩展名附加到无扩展名文件,请查看有关它的MSDN 文档

myOpenFile.DefaultExt = ".bmp"

无论如何,您可以获得过滤器的第一个扩展,执行如下操作:

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

然后你需要以*你想要的方式清除,例如:

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

我向您推荐第二个示例,因为即使过滤器没有*并且具有更具体的文件名,它也会获得扩展名。

于 2013-04-05T06:01:34.253 回答
1

与其使用正则表达式来拆分字符串,不如简单地使用 SysDragon 建议的 Split 函数 - 你没有理由不这样做。一旦你有了原始字符串的第二部分,那么这个正则表达式会让你成为唯一的匹配BMP项。*.BMP;*.JPG;*.GIF

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

简而言之,这说明了以下内容:

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

我任意选择了 1-4 个字母数字字符,但您可以根据需要对其进行调整,例如{3},表示“正好找到三个”,[A-Za-z]{1,3}意思是“从字母 AZ 和 az 中找到至少一个和最多三个匹配项”。

由于您只想要第一个扩展,这将满足您的需求,但您始终可以修改模式以将所有扩展作为匹配集合提供给您。事实上,正则表达式甚至更简单(但是为什么在 1 可以返回n匹配项时呢?),我将把它作为学习练习 :-)

于 2013-04-05T15:33:05.317 回答
0

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

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

打破名称和文件的表达

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

分成两部分

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

然后我使用了正则表达式

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

Entension第一个正则表达式组而言,以获得更多组,例如BMP, JPGGIF然后进行第一个组匹配。我真的要感谢Steve Pettifer鼓励使用Expresso

于 2013-04-05T11:36:38.940 回答