●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では使えないみたいですね...
Posted by: きむらしのぶ | 2006年03月11日 18:15
Mac版Excelでは使えないのですね。VBScriptがMac非対応ってことなのかな。
ヘルプに書いてないのはそういう理由なんですかね。
Posted by: gena | 2006年03月12日 15:13