【问题标题】:Extract Excel VBA filenames from string从字符串中提取 Excel VBA 文件名
【发布时间】:2019-12-10 09:38:34
【问题描述】:

我想从字符串中提取文件名。字符串的长度和文件名的长度总是不同的。 必须用 VBA 完成!

字符串:

href ist gleich: "abc/db://test.pdf|0|100">Bsp.:

我想要这样: 测试.pdf

我不知道该怎么做。 如果脚本可以从字符串中提取多个文件名,那就太好了。

Zb:

字符串:

href ist gleich: "abc//db://test.t.pdf|0|100" "db://test1.pdf|0|100">Bsp.

我想要:

test.t.pdf test1.pdf

【问题讨论】:

  • 名称是否总是有 // 和 |之后?
  • 您可以使用像 db://([^|"\s]+\.pdf)\| 这样的正则表达式并从捕获组 1 中获取值。参见 regex101.com/r/QoOiXZ/1
  • 没有其他例子可以是:leich: "file://D:/ETVGI_556/Carconfigurator_file/carconf_d.pdf">carconfig
  • 然后试试/([^/|"\s]+\.pdf) regex101.com/r/rad6lx/1/(\w+\.pdf) regex101.com/r/zb4ISt/1
  • 尝试在字符串中查找.pdf,然后查找` in the string before the .pdf`..?

标签: excel vba string windows extract


【解决方案1】:
Sub testExtractFileName()
 Debug.Print extractFileName("file://D:/ETVGI_556/Carconfigurator_file/carconf_d.pdf", "//")
 Debug.Print extractFileName("abc//db://test.t.pdf|0|100")
 Debug.Print extractFileName("db://test1.pdf|0|100")
End Sub

Function extractFileName(initString As String, Optional delim As String) As String
 Dim necString As String
   necString = left(initString, InStr(initString, ".pdf") + 3)
   necString = Right(necString, Len(necString) - InStrRev(necString, _
            IIf(delim <> "", delim, "/")) - IIf(delim <> "", Len(delim) - 1, 0))
   extractFileName = necString
End Function

唯一的条件是文件名前面(一直)在初始字符串中存在"//"个字符。当然文件扩展名一直是.pdf. 如果不是,这个扩展名是必需的,功能可以很容易地适应...... 如果第二个(可选)参数为"//",则函数返回全名,如果省略则只返回文件名(不带路径)。

【讨论】:

    【解决方案2】:

    一个选项可能是使用一种模式,您可以匹配前面的 / 并在一组中捕获 1+ 个单词字符 \w+,后跟 .pdf

    您的价值在于捕获第 1 组。

    /(\w+\.pdf)
    

    查看regex demo

    如果您想获得比\w 更广泛的匹配,您可以使用字符类扩展您想要匹配的内容,或使用negated character class [^ 来匹配除字符类中列出的任何字符。

    在这种情况下,否定字符类 [^/|"\s] 将匹配除 / | " 或空白字符 \s 之外的任何字符

    /([^/|"\s]+\.pdf)
    

    查看另一个regex demo

    【讨论】:

      【解决方案3】:

      试试这个并根据您的需要进行编辑。至少它是为您的两个示例设计的。

      Dim sStringToFormat As String
      Dim i As Integer
      Dim vSplit As Variant
      Dim colFileNames As Collection
      Dim sFormattedString As String
      
      Set colFileNames = New Collection
      
      sStringToFormat = "href ist gleich: ""abc//db://test.t.pdf|0|100"" ""db://test1.pdf|0|100"">Bsp."
      
      vSplit = Split(sStringToFormat, "/")
      
      For i = LBound(vSplit) To UBound(vSplit)
      
          If InStr(vSplit(i), ".") > 0 Then
              sFormattedString = Split(vSplit(i), "|")(0)
              sFormattedString = Split(sFormattedString, "<")(0)
              sFormattedString = Split(sFormattedString, ">")(0)
              colFileNames.Add sFormattedString
          End If
      
      Next i
      

      【讨论】:

      • 我认为他不想同时测试两个字符串。恐怕这只是他定义需求的一种糟糕方式......
      • 他需要从字符串返回所有带有扩展名的文件名。不仅是第一场比赛
      • 我的意思是你可能是对的,但我不明白他到底需要什么。我(只是)相信他需要从每个这样的字符串中提取路径。一根绳子,不是他呈现的东西。但我也可能错了……我想,现在轮到澄清问题了。
      • 您可能在最后更改了变量名,而您忘记在vSplit = Split(sStringToFormat, "/") 中更改vSplit = Split(s, "/")。我认为编辑和更正它很好......
      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2022-08-12
      • 2023-04-04
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多