如何用VB.NET从不同格式文件名中提取日期?
修正VB.NET代码以适配两类文件名
问题分析
原代码通过Split("-")(1)提取日期片段,但第一类文件名Mozart - Cpt - 03 Aug 2024.xlsx包含两个-,取索引1得到的是Cpt,无法转换为日期,导致逻辑失效。需要换一种方式精准定位日期所在的部分。
方案一:从末尾截取日期片段
日期始终位于最后一个-和.xlsx之间,因此可以通过定位最后一个-的位置来提取日期:
' 替换为你的实际文件路径 Dim filePath As String = "Mozart - Cpt - 03 Aug 2024.xlsx" Dim fileName As String = Path.GetFileName(filePath) ' 找到最后一个"-"的位置 Dim lastDashIndex As Integer = fileName.LastIndexOf("-") ' 截取最后一个"-"后到".xlsx"前的内容,去除前后空格 Dim datePart As String = fileName.Substring(lastDashIndex + 1, fileName.IndexOf(".xlsx") - lastDashIndex - 1).Trim() ' 转换为目标日期格式 Dim mDate As String = Format(CDate(datePart), "yyyy/MM/dd")
方案二:用正则表达式匹配固定格式日期
如果日期格式固定为dd MMM yyyy(如03 Aug 2024),正则表达式可以直接匹配目标日期,适配性更强:
Imports System.Text.RegularExpressions Imports System.IO ' 替换为你的实际文件路径 Dim filePath As String = "Mozart - 03 Aug 2024.xlsx" Dim fileName As String = Path.GetFileName(filePath) ' 匹配dd MMM yyyy格式的日期 Dim dateRegex As New Regex("\d{2} \w{3} \d{4}") Dim dateMatch As Match = dateRegex.Match(fileName) If dateMatch.Success Then ' 指定英文区域确保月份缩写识别正常 Dim enCulture As New Globalization.CultureInfo("en-US") Dim mDate As String = Format(CDate(dateMatch.Value, enCulture), "yyyy/MM/dd") ' 后续可使用转换后的mDate End If
额外说明
- 确保代码引用
System.IO命名空间(用于Path类),正则方案需额外引用System.Text.RegularExpressions。 - 若系统区域非英文,转换日期时指定
en-US文化信息可避免月份缩写识别失败。
内容的提问来源于stack exchange,提问作者Skye
相关产品推荐
相关产品推荐

