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

时间:2011-07-27 22:27:36

标签: 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

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

msgbox findTIFname("\\abc\def\ghi\jkl\41e07.tif")

我得到以下输出:

41e07.tif

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

2 个答案:

答案 0 :(得分:4)

语法(?:...)非捕获组。你需要的是一个正向前瞻断言,它有(?=...)语法,如下所示:

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

请注意,环视断言的零宽度并且不使用任何字符。

答案 1 :(得分:3)

您是否真的需要使用 RegEx 执行此操作? 访问(或更好的是,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

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