我想在OpenFileDialog
文件过滤器字符串的扩展列表中找到第一个扩展。
考虑下面的例子 -
Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF
Text files (*.txt)|*.txt
对于第一种情况 - 现在如果用户尝试保存没有扩展名的文件,那么默认情况下我想将.BMP
扩展名附加到文件名。
对于第二种情况 - 现在如果用户尝试保存没有扩展名的文件,那么默认情况下我想将.txt
扩展名附加到文件名。
您有一个属性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))
我向您推荐第二个示例,因为即使过滤器没有*
并且具有更具体的文件名,它也会获得扩展名。
与其使用正则表达式来拆分字符串,不如简单地使用 SysDragon 建议的 Split 函数 - 你没有理由不这样做。一旦你有了原始字符串的第二部分,那么这个正则表达式会让你成为唯一的匹配BMP
项。*.BMP;*.JPG;*.GIF
^\|\*\.(\w{1,4});
简而言之,这说明了以下内容:
我任意选择了 1-4 个字母数字字符,但您可以根据需要对其进行调整,例如{3}
,表示“正好找到三个”,[A-Za-z]{1,3}
意思是“从字母 AZ 和 az 中找到至少一个和最多三个匹配项”。
由于您只想要第一个扩展,这将满足您的需求,但您始终可以修改模式以将所有扩展作为匹配集合提供给您。事实上,正则表达式甚至更简单(但是为什么在 1 可以返回n匹配项时呢?),我将把它作为学习练习 :-)
我使用了两种不同的正则表达式来完成任务。我使用的第一个正则表达式是
(?<Name>[^|]*)\|(?<Extension>[^|]*)\|?
打破名称和文件的表达
Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF
分成两部分
Image Files(*.BMP;*.JPG;*.GIF)
*.BMP;*.JPG;*.GIF
然后我使用了正则表达式
\*\.(?<Name>[^;]\w*)
就Entension
第一个正则表达式组而言,以获得更多组,例如BMP
, JPG
,GIF
然后进行第一个组匹配。我真的要感谢Steve Pettifer鼓励使用Expresso。