.txt文件名迭代vb.net

时间:2014-05-30 09:03:21

标签: regex vb.net iteration filenames

关于迭代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

2 个答案:

答案 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来保持一致)。