如何在 VBA 正则表达式中使用非捕获组?

sig*_*gil 4 regex vba

使用 VBA,我试图使用正则表达式从没有扩展名的 UNC 路径中捕获文件名 - 仅查看 .TIF 文件。

到目前为止,这就是我所拥有的:

Function findTIFname(filestr As String) As String

Dim re As RegExp
Dim output As String
Dim matches As MatchCollection

Set re = New RegExp
re.pattern = "[^\\]+(?:[.]tif)$"
Set matches = re.Execute(filestr)
If matches.Count > 0 Then
    output = matches(0).Value
Else
    output = ""
End If
findTIFname = output

End Function
Run Code Online (Sandbox Code Playgroud)

但是当我按如下方式运行函数时:

msgbox findTIFname("\\abc\def\ghi\jkl\41e07.tif")
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

41e07.tif
Run Code Online (Sandbox Code Playgroud)

我认为“(?:xxx)”是非捕获组的正则表达式语法;我究竟做错了什么?

rid*_*ner 5

语法(?:...)是一个非捕获组。这里你需要的是一个积极的前瞻断言,它的(?=...)语法如下:

re.pattern = "[^\\]+(?=[.]tif$)"

请注意,环视断言的宽度为零且不消耗任何字符。


Chr*_*cht 5

您真的需要使用RegEx来做到这一点吗?
Access(或者更好的是 MS Office)具有内置方法,无需 RegEx 即可轻松完成此操作。

您只需要引用 Microsoft Scripting Runtime(据我所知,它应该包含在每个 MS Office 安装中)。
然后你可以使用FileSystemObject

Public Function findTIFname(filestr As String) As String

    Dim fso As FileSystemObject
    Set fso = New FileSystemObject

    If fso.GetExtensionName(filestr) = "tif" Then
        findTIFname = fso.GetBaseName(filestr)
    End If

    Set fso = Nothing

End Function
Run Code Online (Sandbox Code Playgroud)

鉴于您的示例 UNC 路径\\abc\def\ghi\jkl\41e07.tif,这将返回41e07