【问题标题】:.txt filename iteration vb.net.txt 文件名迭代 vb.net
【发布时间】:2014-07-19 23:43:36
【问题描述】:

我在迭代 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

【问题讨论】:

  • 没有必要将\d放在字符类([…])中,因为它已经是一个字符类(当然,除非你想组合多个字符类)。
  • @Richard 先生,那就是(?&lt;num&gt;\d+),对吗?
  • 是的,没错。
  • 先生,我已经改过了,但问题仍然存在。
  • 我使用了评论,因为这不是你的问题,只是一个附带问题。为了解决这个问题,我将开始查看您得到的MatchCollection 的内容:我希望每个文件有三个匹配项……就我个人而言,我会寻找一个正则表达式来匹配文件名中的所有三个数字,所以我知道我'正在处理正确的数字,而不是依靠条件来分隔不同的匹配项。

标签: regex vb.net iteration filenames


【解决方案1】:

这里是:

(?<num>\d+(?=$))

这将确保数字后跟&gt;$(行尾)。这将确保它是最后一组数字。

【讨论】:

  • 它不起作用,先生。$ 确实减少了线路,但它仍然无法检测到 10。
  • 我不是专家。在 VB 中,但如果你去 regexhero 并使用一些示例字符串进行测试,例如。 &lt;1&gt;-&lt;2010&gt;_filename-&lt;1&gt; &lt;2&gt;-&lt;2010&gt;_filename-&lt;5&gt; &lt;3&gt;-&lt;2010&gt;_filename-&lt;10&gt; &lt;4&gt;-&lt;2010&gt;_filename-&lt;101&gt; &lt;30&gt;-&lt;2010&gt;_filename-&lt;500&gt; &lt;31&gt;-&lt;2010&gt;_filename-&lt;1567&gt;。我发现它有效。
  • 我认为 Q 中的 &lt;&gt; 只是文件名的分隔部分:Windows 上的文件名不支持这些字符(这是一个 VB.net 问题)。
  • @Richard 你是绝对正确的。感谢您指出。编辑了我的答案。
【解决方案2】:

查看一些真实文件名真的很有帮助,包括一些不匹配的文件名(你的​​描述并不完全明确:例如,如果不包括年份,&lt;date&gt; 是什么?) .

但假设文件如下:

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+)$

应该匹配文件名的最后数字($ 匹配字符串的结尾),不带扩展名:BaseName in PSH):

dir | foreach { if ($_.BaseName -match '(?<num>\d+)$') { $matches['num'] } }

给予:

1 11 3 5 7 9

因此所有文件名都匹配,并且它们的基名的最终数量由正则表达式的组“num”匹配。

我认为您的方法还有其他原因:我建议更改为每个文件名仅获得一个匹配项(并使用 Regex.Match 而不是 Matches 保持一致)。

【讨论】:

  • 我试过(?&lt;num&gt;\d+)$ 还是不行。我也试过\d{1,}$\d{1,3},但最后还是没有检测到两位数。但是,我注意到当使用\d{2}$ 时,它可以工作,但它无法检测到单个数字。很抱歉,我不太明白您的建议,您能详细说明一下吗?
  • @svynsaenz \d{2}$ 匹配末尾的两位数,因此不会匹配其他情况。请在 Q 中添加一些真实的文件名(匹配成功和失败)。
猜你喜欢
  • 2011-11-25
  • 2017-10-17
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
相关资源
最近更新 更多