关于迭代txt文件的文件名,我遇到了一些问题。我的文件名格式如下:<date>-<year>_filename-<number>.txt
。问题是当<number>
达到9时,文件名停止迭代。
文件名是这样的:
31-2014_filename-1
31-2014_filename-2
31-2014_filename-3
31-2014_filename-4
31-2014_filename-5
31-2014_filename-6
31-2014_filename-7
31-2014_filename-8
31-2014_filename-9
31-2014_filename-10
该功能最多只能检测到9.超出该数量的任何内容都将被忽略。 以下是代码
Dim lastreport As Integer = 1
Public Sub GetLastNo(ByVal filePath As String)
Dim lastFile As String = 1
Dim files() As String = Directory.GetFiles(filePath, "*.txt")
For Each File As String In files
File = Path.GetFileNameWithoutExtension(File)
Dim numbers As MatchCollection = Regex.Matches(File, "(?<num>[\d]+)")
For Each number In numbers
number = CInt(number.ToString())
If number > 0 And number < 1000 And number > lastFile Then
lastFile = number
End If
lastreport = number
Next
Next
End Sub
答案 0 :(得分:0)
这是:
(?<num>\d+(?=$))
这将确保数字后跟>
和$
(行尾)。这将确保它是最后一组数字。
答案 1 :(得分:0)
查看一些真正的文件名确实很有帮助,包括一些无法匹配的文件名(您的描述并非完全明确:例如<date>
如果不包含年份?)。
但假设文件如:
30May-2014_Stuff-1.txt 30May-2014_Stuff-3.txt 30May-2014_Stuff-5.txt 30May-2014_Stuff-7.txt 30May-2014_Stuff-9.txt 30May-2014_Stuff-11.txt
然后使用.NET正则表达式引擎(来自PowerShell(PSH)这里更快地测试):
(?<num>\d+)$
应匹配文件名的最终数字($
匹配字符串的结尾),而不包含扩展名:PSH中的BaseName
:
dir | foreach { if ($_.BaseName -match '(?<num>\d+)$') { $matches['num'] } }
给出:
1 11 3 5 7 9
所以所有文件名都匹配,并且它们的基本名称的最终数量与正则表达式的“num”组相匹配。
我认为您的方法还有其他内容:我建议您更改为每个文件名只能获得一个匹配项(并使用Regex.Match
而不是Matches
来保持一致)。