あなたはLike演算子を使っていますか? 正規表現が使えない場合に、Like演算子で代替することができて便利です。
この記事では、Like演算子について基本的な使い方から、
- ワイルドカードのエスケープ
- Likeの否定(Not)
- 複数条件を指定するには
- 大文字小文字の区別なしで使用するには
など応用的な内容まで、Like演算子について使い方をわかりやすく解説します!
Like演算子とは
Like演算子は2つの文字列を比較するために使用します。Like演算子は以下のように記述して使います。
result = string Like pattern
stringとpatternはString型の文字列です。stringがpatternに一致する場合resultはTrueになり、一致しない場合resultはFalseになります。
stringまたはpatternのどちらかがNullの場合、resultはNullになります。patternにはパターンマッチング規則に準拠する文字列を指定することができます。
ワイルドカード文字や文字のリスト、文字の範囲を組み合わせて正規表現に近いパターンマッチングを行うことができます。
Like演算子の使い方
Like演算子はresultにTrueもしくはFalseを格納するので、Ifステートメントと合わせてよく使われます。以下のような記述になります。
If string Like pattern Then 処理 End If
サンプルコードで確認しましょう。
Sub macro1() Dim arr() As String, str As String, pattern As String, msg As String str = "侍エンジニア" pattern = "[エンジニア]" '配列に文字列を1文字ずつ格納 Dim i As Integer ReDim arr(1 To Len(str)) For i = 1 To UBound(arr) arr(i) = Mid(str, i, 1) Next i For Each ele In arr If ele Like pattern Then msg = msg & ele & ", " End If Next ele MsgBox msg End Sub
実行結果:
このサンプルコードでは、まずFor Eachステートメントを使って配列arrの要素1つずつを抽出しています。それぞれの要素をLike演算子を使ってString型変数patternと一致するかマッチングを行い、マッチした場合はその要素を表示しています。
ちなみに変数pattern内で使われいる”[ ]”はワイルドカードで使用される文字で、ワイルドカードとそれに使われる文字については後ほど解説します。
ワイルドカードとは
ワイルドカードとは、あるパターンにマッチするように表現した文字列のことです。不特定の文字列があるパターンにマッチするか一括で判定する場合などに使われます。
ワイルドカードで使われる文字について表にまとめした。
文字 | 説明 |
---|---|
? | 任意の1文字 |
* | 0文字以上の文字 |
# | 0~9の半角数字 |
[charlist] | charlistに含まれる全角または半角の1文字 |
[!charlist] | charlistに含まれない全角または半角の1文字 |
ワイルドカードで使える文字は、正規表現で使える文字に比べて少ないので、正規表現に比べて表現できるパターンには制限があります。
それではサンプルコードで確認してみましょう。文字”!”を使ってcharlistに含まれない文字を出力表示します。
Sub macro2() Dim arr() As String, str As String, pattern As String, msg As String str = "侍エンジニア" pattern = "[!エンジニア]" '配列に文字列を1文字ずつ格納 Dim i As Integer ReDim arr(1 To Len(str)) For i = 1 To UBound(arr) arr(i) = Mid(str, i, 1) Next i For Each ele In arr If ele Like pattern Then msg = msg & ele & ", " End If Next ele MsgBox msg End Sub
実行結果:
このサンプルコードでは、先ほどのサンプルコードの変数patternの値を”[!エンジニア]”としています。したがって、配列arrの要素から”エンジニア”のいずれの文字とも一致しない文字が出力表示されています。
ワイルドカードのエスケープ
ワイルドカードとそれに使用する文字について解説しました。ワイルドカードで使われている文字、例えば”?”や”!”などをLike演算子のpatternの中に使いたい場合、どうしたらよいのでしょうか?
“?”や”!”などのワイルドカードで使われる文字をLike演算子のpattern中で使えるように記述することをワイルドカードのエスケープと呼びます。ワイルドカードで使われる文字は”[ ]”で囲むことでエスケープすることができます。
サンプルコードで確認しましょう。
Sub macro3() Dim arr() As String, str As String, pattern As String str = "侍エンジニア!" pattern = "*[!]*" If str Like pattern Then MsgBox "! が見つかりました" End If End Sub
実行結果:
このサンプルコードでは、Like演算子を使ってString型変数patternと一致するかマッチングを行っています。変数patternにはワイルドカードで使用する文字”!”を”[ ]”で囲って使用しています。
変数strには文字”!”が含まれますので、結果が出力表示されています。
Likeの否定(Not)
IfステートメントでLikeを否定する記述は下記のとおりになります。
If Not string Like pattern Then 処理 End If
サンプルコードで確認しましょう。
Sub macro4() Dim arr() As String, str As String, pattern As String, msg As String str = "侍エンジニア" pattern = "[エンジニア]" '配列に文字列を1文字ずつ格納 Dim i As Integer ReDim arr(1 To Len(str)) For i = 1 To UBound(arr) arr(i) = Mid(str, i, 1) Next i For Each ele In arr If Not ele Like pattern Then msg = msg & ele & ", " End If Next ele MsgBox msg End Sub
実行結果:
複数条件を指定するには
複数条件を指定するには論理演算子「And」や「Or」を使用します。サンプルコードで確認しましょう。
Sub macro5() Dim arr() As String, str As String, pattern1 As String, pattern2 As String str = "侍エンジニア!" pattern1 = "*[侍]*" pattern2 = "*[塾]*" Dim bool As Boolean bool = str Like pattern1 And str Like pattern2 If bool Then MsgBox "侍 も 塾 も見つかりました" End If End Sub
実行結果:
大文字小文字の区別なしで使用するには
Like演算子は大文字小文字を区別してパターンマッチングの判定を行います。これに対し、大文字小文字の区別なしでLike演算子の判定を行うには2つの方法があります。
1つ目は、Option Compare Textで指定する方法です。2つ目は、比較する2つの文字列を「どちらも大文字」もしくは「どちらも小文字」に変換してから比較する方法です。
それぞれくわしくみていきましょう。
Option Compare Textで指定する方法
Option CompareステートメントをTextで指定すると、文字列比較は大文字と小文字を区別しなくなります。サンプルコードで確認しましょう。
Option Compare Text Sub macro6() Dim arr() As String, str As String, pattern As String str = "Hello VBA!" pattern = "*[vba]*" If str Like pattern Then MsgBox "vba が見つかりました" End If End Sub
実行結果:
大文字もしくは小文字に変換する方法
文字列を大文字に変換するにはUCase関数を、小文字に変換するにはLCase関数を使用します。比較する文字列をどちらも大文字に変換してLike演算子で判定してみましょう。
Sub macro7() Dim arr() As String, str As String, pattern As String str = "Hello VBA!" pattern = "*[vba]*" If UCase(str) Like UCase(pattern) Then MsgBox "vba が見つかりました" End If End Sub
実行結果:
文字列の操作総まとめ
この記事では紹介しきれなかった文字列の様々操作についてはこちらの記事で解説しているので、ぜひ確認してみてください!
まとめ
ここでは、Like演算子の使い方について説明しました。Like演算子はワイルドカードを使ってパターンマッチングができます。
正規表現が使えない場合などは、Like演算子とワイルドカードで代替することができて便利です。使いこなすことができるように、この記事を何度も参考にして下さいね!