aodama.gif(0.97KB) 高機能な InStr 関数

 VBScript の RexExp オブジェクトを使用することにより、 正規表現を使用した文字列の検索が可能になります。 しかし VBScript Version 5.0 以上が使用できる環境が必要となります。

Option Explicit

'----- MatchData ユーザー定義型 -----
'InStrEx 関数による検索で見つかった文字列のデータを
'格納するユーザー定義型です。
'
'メンバ Find
'   検索対象の文字列内で一致が見つかった場所が格納されます。
'   VBScript の Match オブジェクトの FirstIndex プロパティは
'   文字列の最初の文字を 0 としていますが、この Find メンバは
'   文字列の最初の文字を 1 としていますのでご注意下さい。
'
'メンバ Length
'   検索対象の文字列内で一致した文字列の長さが格納されます。
'
'メンバ Value
'   検索対象の文字列内で一致した文字列が格納されます。
'
Public Type MatchData
    Find As Long
    Length As Long
    Value As String
End Type

'----- InStrEx 関数 Ver 1.00 -----
'正規表現によるパターン検索を行い、検索されたデータを
'MatchData 型配列に格納します。なおこの関数を使用するには、
'VBScript 5.0 以上が使用できる環境が必要です。
'
'引数 strTarget
'   必ず指定します。検索対象となる文字列式を指定します。
'
'引数 strPattern
'   必ず指定します。検索される正規表現のパターンを設定します。
'
'引数 udtMatchData()
'   必ず指定します。strTarget 内で見つかった文字列のデータを
'   格納する MatchData 型動的配列を指定します。
'   配列サイズは関数内で初期化されますので、宣言のみ行い渡します。
'
'引数 blnIgnoreCase
'   省略可能です。パターン検索で大文字と小文字を区別するかどうかを
'   示す Boolean 値を設定します。
'
'   True  - 大文字小文字を区別しない("i" オプションに相当)
'   False - 大文字小文字を区別する
'
'   省略すると True が使用されます。
'
'引数 blnGlobal
'   省略可能です。検索文字列全体についてのパターンとの一致を
'   検索するか、最初の一致だけを検索するかを示す Boolean 値を設定します。
'
'   True  - 文字列全体に検索が適用される("g" オプションに相当)
'   False - 最初に見つかった文字列だけが適用される
'
'   省略すると True が使用されます。
'
'戻り値
'   関数が成功すると、配列 udtMatchData() に格納した要素の
'   個数(検索一致数)が返ります。見つからなかった場合は 0 が返ります。
'
'まあわざわざ関数化してリソースを消費するのも何ですが、個人的には
'メインコード内で何度も CreateObject したりするのが嫌なので(^^;
'
Public Function InStrEx _
    (ByRef strTarget As String, _
     ByRef strPattern As String, _
     ByRef udtMatchData() As MatchData, _
     Optional ByVal blnIgnoreCase As Boolean = True, _
     Optional ByVal blnGlobal As Boolean = True) As Long

 Dim objRegExp As Object                                'RegExp オブジェクトを参照するオブジェクト変数
 Dim objMatches As Object                               'Matches コレクションを参照するオブジェクト変数
 Dim objMatch As Object                                 'Match オブジェクトを参照するオブジェクト変数
 Dim lngMatchCount As Long                              'Matches コレクションの要素数を格納する変数
 Dim i As Long                                          'カウンタ
 
    Set objRegExp = CreateObject("VBScript.RegExp")     'RegExp オブジェクトへの参照を作成
    objRegExp.Pattern = strPattern                      '正規表現パターンの設定
    objRegExp.IgnoreCase = blnIgnoreCase                '大文字小文字を区別するか否か
    objRegExp.Global = blnGlobal                        '文字列全体に検索を行うか否か
    
    Set objMatches = objRegExp.Execute(strTarget)       'Execute メソッドで検索し objMatches に結果を格納
    lngMatchCount = objMatches.Count                    'objMatches の要素数を得る
    If Not CBool(lngMatchCount) Then GoTo ExitFunction  '見つからなかった場合、ExitFunction ラベルに飛ぶ
    
    ReDim udtMatchData(lngMatchCount - 1)               'MatchData 型配列のサイズを確保
    For Each objMatch In objMatches                     'objMatches の要素の最後までループ
        udtMatchData(i).Find = objMatch.FirstIndex + 1  '文字列が見つかった位置を格納
        udtMatchData(i).Length = objMatch.Length        '見つかった文字列の長さを格納
        udtMatchData(i).Value = objMatch.Value          '見つかった文字列を格納
        i = i + 1                                       'カウンタをインクリメント
    Next

ExitFunction:
    
    Set objRegExp = Nothing                             'オブジェクトの解放
    Set objMatches = Nothing
    Set objMatch = Nothing
    
    InStrEx = lngMatchCount                             '見つかった件数を返す
 
End Function

サンプル : ダウンロード instrex.lzh(4.22KB)

 RegExp オブジェクトを利用した文字列の置換については、 文字列の置き換えをする(Replace) - おまけをお読み下さい。


VBコーナーにもどる   トップページにもどる