回答編集履歴

1 RegEx.Matchの第3引数を追加

kenshirou

kenshirou score 327

2018/11/08 18:48  投稿

前提として、
・バージョン番号は数字のみで、メジャー・マイナーのみが設定されている。
 (「v○.○○」の形式)
・バージョン番号は、メジャー・マイナー番号ともに1個以上の数字である。
 (v10.01等も考慮して)
・対象フォルダーには必ず「test_v○.○○.xlsx」の形式のファイルが存在する。
・対象フォルダー内の「test_v○.○○.xlsx」名ファイルは1つである。
 (仮に複数あった場合であってもどれか一つが抽出される。)
の条件であれば、以下の方法で、対象フォルダ内の「test_v○.○○.xlsx」のファイル名を取得できます。
1.対象フォルダ内の「test_v*.xlsx」に該当するファイルを検索する。
2.上記1.の結果の中で、「test_v○.○○.xlsx」の形式にマッチするファイルを選択する
そのコードは以下の通りです。
そのコードは、例えば以下の通りとなります。
≪補足≫
RegEx.Matchの第3引数を追加して大文字・小文字を無視するようにしました。
(ファイル名の大文字・小文字はWindows側では区別しないため)
```VB.NET
Imports System.IO
Imports System.Text.RegularExpressions
'↑それぞれDirectoryクラスとRegexクラスの名前空間です。
'(クラス定義は省略)
   Private Function GetVerExcelFileName() As String
       Dim verFile As String = Nothing
       For Each f As String In Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory(), "test_v*.xlsx")
           If Regex.IsMatch(Path.GetFileName(f), "test_v[0-9]+\.[0-9]+\.xlsx") Then
           If Regex.IsMatch(Path.GetFileName(f), "test_v[0-9]+\.[0-9]+\.xlsx", RegexOptions.IgnoreCase) Then
               Return f
           End If
       Next
       Return Nothing
       'Linqを使って1行で書くとこんな感じ(.Netのバージョンによって書き方が変わるかも知れない)
       'Return (From f As String In Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory(), "test_v*.xlsx") _
       '       Where Regex.IsMatch(Path.GetFileName(f), "test_v[0-9]+\.[0-9]+\.xlsx")).FirstOrDefault
   End Function
```
なお、exeのあるパスを取得する際にDirectory.GetCurrentDirectory()を使わなかったのは、作業フォルダーの変更があると、これがexeのあるパスを指さない場合があるためです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る