2011-07-27 36 views
2

使用VBA,我試圖使用正則表達式來捕獲UNC路徑中的文件名,而不使用擴展名 - 僅查看.TIF文件。如何在VBA正則表達式中使用非捕獲組?

到目前爲止,這是我:

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)」是非捕獲組的正則表達式語法;我究竟做錯了什麼?

+0

不錯的代碼!我使用了非常相似的東西,但我使用了第二個參數來表示重複模式,所以我可以傳入任何參數而不是硬編碼。只是一個提示:當你聲明它時,VBA會自動生成output =「」,所以最後不需要這個Else語句。而不是使用> 0,可以使用<> 0來更好地優化(更快地檢查不等式)。 – aevanko

回答

4

語法(?:...)非捕獲組。你所需要的就是一個正預測先行斷言具有(?=...)語法像這樣:

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

注意環視斷言有零寬度和不消耗字符。

+0

啊,這是做到了。謝謝! – sigil

+0

這對我也很有幫助 - 謝謝。現在我很困惑什麼是非捕獲組織甚至。你會追加並簡要解釋一下嗎? – Praesagus

+1

@Praesagus - 不,但更好的讓我引導你到這個主題上的一個很好的tuorial:[Lookaround Assertions](http://www.regular-expressions.info/lookaround.html)。這個全面的網站教程是所有正則表達式的優秀參考。請享用! – ridgerunner

3

您真的需要這樣做嗎RegEx
訪問(或更好,微軟Office)有內置的方法來做到這一點很容易,沒有正則表達式。

你只需要參考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

+0

很酷。我以前從未使用GetBaseName - 這可能對未來有所幫助。 ^^ – aevanko

+0

這工作得很好。謝謝你的提示! – sigil

+0

我沒有說FSO比RegEx更**內置。我的觀點是:爲什麼使用RegEx從**路徑中獲取文件名時**是一個完全用於此目的的類。 –

相關問題