C#のプログラミングを続けていれば、正規表現を使うことにも慣れてきます。
しかし、ExcelのVBAやVisual Basic(以下VB)のLike文しか使ったことのない人に、マッチングパターンを使うソフトウェアを提供するような場合、正規表現を覚えてもらうことは、ハードルが高いです。
そこで、C#でVisual Basicを使う方法を調べてみました。
Microsoft.VisualBasic.CompilerServices.LikeOperatorを使う方法
先ずは、C#のコンソールアプリを作って、以下のコードを入力してみてください。
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
var result1 = LikeOperator.LikeString("abcdefg", "*bc?e*", CompareMethod.Binary);
Console.WriteLine($"{result1}");
var result2= LikeOperator.LikeString("abcdefg", "*BC*",CompareMethod.Binary);
Console.WriteLine($"{result2}");
このコードは、Microsoft.VisualBasic.CompilerServices.LikeOperatorクラスのLikeStringメソッドを2回呼び出しています。
LikeOperatorの前に長々と名前空間名を付けたくないので、あらかじめ、
using Microsoft.VisualBasic.CompilerServices;
と宣言しています。
VBで「A Like B」という文は、「LikeString(A, B, CompareMethod.Binary)」になります。
CompareMethod.Binaryはおまじないで、大文字小文字を区別してテキスト比較をするという意味です。本来の表現は、Microsoft.VisualBasic.CompareMethod.Binaryとなりますが、こちらも長々と書きたくないので、あらかじめ、
using Microsoft.VisualBasic;
と宣言しています。
このコードを「Ctrl + F5」で実行させると、大文字小文字を区別するので、
となり、正常動作が確認できます。
なお、CompareMethod.Textを使えば、大文字と小文字を区別せずに比較するので、どちらもTrueとなります。
ところで、Microsoftのこちらのページによれば、「This helper method is not meant to be called directly from your code.」と書いてあります。つまり、あなたのコードから直接呼び出すことを意図していないということです。
そう書かれていても・・・使いたいですよね。
Visual Basicのプロジェクトを呼ぶ方法
Microsoftさんに注意されない方法として、Visual Basicのプロジェクトを呼ぶ方法が考えられます。
C#のコンソールアプリ等の開発環境から、「ファイル⇒追加⇒新しいプロジェクト」を選びます。
右上の条件のところを「Visual Basic」「Windows」「ライブラリ」としてから、図のように「クラスライブラリ」を選択して、「次へ」をクリックします。
プロジェクトの名前は「VB」とでもしてください。
更に、デフォルトで用意される「Class1.vb」を「NET.vb」とでも変更します。
NET.vbのエディタに入力するコードは次の通りです。
Public Class NET
Public Shared Function VBLike(ByVal input As String, ByVal pattern As String) As Boolean
Return input Like pattern
End Function
End Class
文字列の「input」と「pattern」を引数とし、Like文でパターンマッチングした論理値を戻り値とする関数です。
実際の画面は次のようになると思います。
次に、C#からVBを呼び出すための仕掛けをします。
このために、C#のプロジェクトファイル名(ここではUsingVBLikeStatement)の左側の▷をクリックして展開します。出てきた「依存関係」を右クリックしてプロジェクト参照の追加をクリックし、VBのチェックボックスをチェックしてからOKで閉じます。
C#のエディタに入力するテストコードは次の通りです。
Console.WriteLine(VB.NET.VBLike("abcde", "?bc*"));
Console.WriteLine(VB.NET.VBLike("abcde", "?BC*"));
実際の画面は次のようになると思います。
このコードを「Ctrl + F5」で実行させると、大文字小文字を区別するので、
という結果が得られます。
まとめ
VBの関数として、Likeだけが欲しいのであれば、こっそりと、LikeOperator.LikeStringを使うのが手軽です。Like以外の関数も欲しければ、VBのプロジェクトを作る方法が良いと思います。
コメント