2011-07-27 38 views
2

VBAでは、拡張子なしでUNCパスからファイル名を取得するためにregexを使用しようとしています.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

ニースコード!私は非常に似たようなものを使用しますが、re.patternの2番目のパラメータを使用するので、ハードコードするのではなく、パラメータを渡すことができます。ちょっとしたヒント:VBAは宣言時に自動的にoutput = ""を作成するので、最後にそのElseステートメントは必要ありません。 > 0を使用する代わりに、より良い最適化のために<> 0を使用することができます(不等式のチェックが速くなります)。 – aevanko

答えて

4

(?:...)は、非キャプチャグループです。前後参照アサーションがゼロ幅を持っており、何の文字を消費しないことを

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

注:ここで必要となるので、同様(?=...)構文を持ってい肯定先読みアサーションです。

+0

ああ、それはそれをしました。ありがとう! – sigil

+0

これは私にとっても非常に役に立ちました - ありがとう。今私は、非捕獲集団が何であるかを混乱させる。追加して簡単に説明しますか? – Praesagus

+1

@Praesagus - いいえ、さらに、私は主題の優れた塔にあなたを案内することができます:[Lookaround Assertions](http://www.regular-expressions.info/lookaround.html)。この包括的なウェブサイトのチュートリアルは、すべての正規表現の参考資料です。楽しい! – ridgerunner

3

RegExでこれを行う必要がありますか?
アクセス(または、より良い、MS Office)には、RegExなしでこれを簡単に行うための組み込みの方法があります。

Microsoft Scripting Runtime(私が知る限り、すべてのMS Officeのインストールに含める必要があります)を参照するだけで済みます。
そして、あなたがFileSystemObjectを使用することができます:あなたの例UNCパス\\abc\def\ghi\jkl\41e07.tif考える

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 

、これは41e07を返します。

+0

それは素晴らしいです。前にGetBaseNameを使用したことはありません - これは将来役立つ可能性があります。 ^^ – aevanko

+0

これは本当にうまくいった。ヒントをありがとう! – sigil

+0

私は、FSOがRegExよりも**もっと**組み込まれているとは言いませんでした。私の要点は、RegExを使用して、**そのクラスが正確にその目的を果たすクラスであるときにパスからファイル名を取得する理由 –

関連する問題