正規表現でn回目に一致する文字列を取得

正規表現で指定のパターンがn番目に一致する文字列を取得する。

検索対象の文字列に対して、正規表現のパターンがn番目に一致した文字列を取得します。

VBAで正規表現を利用するにはRegExpオブジェクトを利用します。
n番目に一致した文字列を取得するにはRegExpオブジェクトのExecuteメソッドとMatchesコレクションを利用します。

サンプルコードでは検索対象の文字列の中で、「0から9で構成された3桁の数字」(※)をパターンとして指定しており、そのパターンで3番目に一致した文字列を検索させています。
 ※この条件をを正規表現で書くと”[0-9][0-9][0-9]”または”[0-9]{3}”となります。
このサンプルコードの「”ABC123DEF456GH789IJ000KLMN”」の場合、条件に一致する文字列で3番目に登場する文字列である”789″が取得されます。

'******************************************************************
' 指定したパターンがn番目に一致する文字列を取得
'******************************************************************
Sub Main_nMatch()

    '検索対象の文字列
    Dim sString As String
    sString = "ABC123DEF456GH789IJ000KLMN"
    
    '検索パターン
    Dim sPattern As String
    sPattern = "[0-9][0-9][0-9]"

    'n番目を指定
    Dim iNumber As Integer
    iNumber = 3

    'n番目に一致する文字列を取得
    Dim vReturn As String
    vReturn = runRegExp_Exe(sString, sPattern, iNumber)
    
    If vReturn = "Error" Then
        Debug.Print "指定した条件に一致する文字列はありません。"
    Else
        Debug.Print "指定した条件に一致する" & iNumber & "番目の文字列は「" & vReturn & "」です。"
    End If

End Sub

'******************************************************************
'  n番目に一致した文字列を取得
'------------------------------------------------------------------
'  第1引数:検索対象の文字列
'  第2引数:正規表現のパターン
'  第3引数:n番目を指定
'------------------------------------------------------------------
'  戻り値 :実行結果
'              条件に一致するn番目の文字列を返す
'              一致する文字が無ければ"Error"の文字列を返す
'******************************************************************
Function runRegExp_Exe(getStr As String, getPtn As String, getNum As Integer) As String

    '0番目を指定ならエラーとして処理を抜ける
    If getNum = 0 Then: runRegExp_Exe = "Error": Exit Function
    
    Dim oReg As Object
    Set oReg = CreateObject("VBScript.RegExp")
    oReg.Pattern = getPtn  '検索するパターンを設定
    oReg.IgnoreCase = True   '大文字と小文字を区別(True:しない、Flase:する)
    oReg.Global = True      '文字列全体を検索(True:する、Flase:しない)

    '正規表現でのマッチングを結果をコレクションに設定
    Dim oMatches As Object
    Set oMatches = oReg.Execute(getStr)
        
    '一致するパターンの有無のカウント数を確認(0なら一致なし)
    If (oMatches.Count > 0) And (oMatches.Count >= getNum) Then
        'n番目に一致した文字列を取得(Indexは0からカウント)
        runRegExp_Exe = oMatches(getNum - 1).Value
    Else
        runRegExp_Exe = "Error"
    End If
    
    Set oMatches = Nothing
    Set oReg = Nothing

End Function

 ■実行結果