« サックスその後 | メイン | SFが読みたい!2006年版 »

2006年03月10日

●VB6.0で正規表現を使う

rubyなど,スクリプト言語を使っているとテキスト処理が多いためか,正規表現のありがたみを感じることが多い。ところが仕事で開発に使っているVB6.0ではヘルプを読んでも正規表現が使えるとは書いてない。

csvファイルを読み込んで内容をチェックしたりするプログラムを書こうとすると,「ここで正規表現が使えれば...」と感じる場面が多くあった。不便だと感じつつも,If〜Thenを繰り返したり,LenだとかMidを駆使して機械的な比較をしたりしていたものだ。

ところがふと,「VB 正規表現」で検索してみたら,下記のようなページを見つけた。

Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化

これはVBScriptで正規表現が使えることを書いてあるページだが,下の方に,

Visual Basic 開発者が正規表現を有効に使えるように、VBScript の正規表現エンジンは COM オブジェクトとして実装されています。つまり、Visual Basic や C などの、VBScript の外部のさまざまなソースからエンジンを呼び出すことができるので、非常に強力です。

と書いてある。この時点で目からウロコ...というよりも,今までの苦労はなんだったのよと脱力したWebmasterであった。使えるなら使えるってヘルプのわかりやすいところに書いといてくれればいいのに...。これってVBをプラットフォームに使っている開発者にとってはあえて言うほどのこともない常識事項なんだろうか。これまで散々時間を費やして無駄なコードを書いてきたことに恥じ入っているWebmasterである。

万が一同様の回り道をする方が居ると可哀想なので,具体的な使い方もメモしておこう。といってもVB6.0で正規表現を使う手順は,

[参照設定]で Microsoft VBScript Regular Expressions 5.5 にチェックを付ける

だけである。拍子抜けするほど簡単だRegular Expressionてそのまんま正規表現のことなのに,今まで参照設定を眺めていても気付かなかったという事実に,さらに脱力感が増すWebmasterであった。

上記参照設定をした上で,試しに下記コードを書いてみると,

Private Sub Command1_Click()
    Dim re As New RegExp		'正規表現オブジェクトの宣言
    Dim teststr As String
    Dim matchstr As MatchCollection		'マッチ結果の格納用コレクション
    Dim i As Integer
    
    re.Pattern = "¥d+:(¥w+)"     'パターンをセット
    re.Global = True            '複数マッチ可
    
    teststr = "1:foo,2:bar,3:hoge,4:foobar"     '評価したい文字列
    
    If re.Test(teststr) = True Then             'ひとつでもマッチするかチェック
        Debug.Print "マッチあり"
        Set matchstr = re.Execute(teststr)      '評価結果をMatchesコレクションに格納
        Debug.Print matchstr.Count                      'マッチした数
        For i = 0 To matchstr.Count - 1
            Debug.Print matchstr.Item(i).Value          'マッチした文字列
            Debug.Print matchstr.Item(i).SubMatches(0)  '()で囲まれた部分の参照(rubyの$1)
        Next i
    Else
        Debug.Print "マッチなし"
    End If

End Sub

見事に次のような結果が得られる。

マッチあり
 4 
1:foo
foo
2:bar
bar
3:hoge
hoge
4:foobar
foobar

この例程度ならsplit関数でもほぼ同様のことが出来ると思うが,正規表現の方が遥かに汎用性が高い。

【参考URL】
http://support.microsoft.com/kb/818802/JA/
http://www.microsoft.com/japan/msdn/library/ja/script56/html/jsgrpRegExpSyntax.asp

【2007.8.13追記】迷惑コメント,トラックバックが多いので,しばらくコメント,トラバを無効にします。

コメント

僕も知らなかった。
とても便利そうなので、早速会社で作ったCVSで保存されたデータを処理するVBAマクロを修正したいと思います。

ただ、Mac版Excelでは使えないみたいですね...

Mac版Excelでは使えないのですね。VBScriptがMac非対応ってことなのかな。
ヘルプに書いてないのはそういう理由なんですかね。