VB.NETで正規表現をマスター!初心者でもわかる文字列検索・抽出の基本
生徒
「文章の中からメールアドレスだけを探したり、電話番号の形になっているかチェックしたりする方法はありますか?」
先生
「そんな時こそ、VB.NETの『正規表現(せいきひょうげん)』を使うのが一番ですよ。」
生徒
「せいきひょうげん…?なんだか難しそうな名前ですね。」
先生
「名前は強そうですが、実は『文字のパターン』を決めるルールのようなものです。基本さえ覚えれば、とても強力な武器になります。一緒に見ていきましょう!」
1. 正規表現(Regular Expression)とは?
VB.NETにおける正規表現(せいきひょうげん)とは、特定の文字そのものを探すのではなく、「数字が3つ続いて、その後にハイフンがあって…」というような文字のパターンを指定して、検索や置き換えを行う仕組みのことです。英語では Regular Expression と呼ばれ、プログラミングの世界では「Regex(レジェックス)」と略されることもあります。
例えば、パソコンのフォルダーの中から「2026」という文字が含まれるファイルを探すのは簡単ですよね。しかし、「数字4桁なら何でもいい」とか「最後に『様』がついている人だけ」という条件で探すのは、普通の検索では一苦労です。正規表現を使えば、このような曖昧で複雑な条件を、短い記号の組み合わせで表現できるようになります。パソコンを触ったことがない方でも、身近な「型抜き」や「パズルのピース」をイメージすると分かりやすいかもしれません。特定の形のピースだけを拾い上げる、そんな魔法のような道具なのです。
2. 正規表現を使うための準備(Imports)
VB.NETで正規表現を使うには、最初に「この道具を使います」という宣言をする必要があります。これをプログラミング用語でインポートと呼びます。正規表現の機能は System.Text.RegularExpressions という名前のツールボックスの中にまとめられています。
プログラムの一番上の行にこれを書くことで、Regex(レジェックス)というクラスが使えるようになります。クラスとは、特定の機能を持った「道具セット」のことだと考えてください。このセットの中には、文字を探す命令、文字を置き換える命令、パターンに合っているか確認する命令など、便利な道具がたくさん詰まっています。
3. 文字がパターンに合っているか調べる(IsMatch)
一番よく使うのが、IsMatch(イズマッチ)という道具です。これは、「対象の文字列が、指定したパターンに当てはまっているか?」を「はい(真)」か「いいえ(偽)」で答えてくれるものです。例えば、ユーザーが入力した電話番号が「数字-数字-数字」の形になっているかをチェックする際に役立ちます。
ここでは、簡単な例として「名前に『様』が含まれているか」を確認するコードを書いてみましょう。正規表現では、特定の文字を探すために専用の記号を使いますが、まずは普通の文字をパターンとして使ってみます。
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim userName As String = "田中太郎様"
Dim pattern As String = "様$" ' $は「最後にあること」を意味する記号です
If Regex.IsMatch(userName, pattern) Then
Console.WriteLine("敬称が含まれています。")
Else
Console.WriteLine("敬称がありません。")
End If
End Sub
End Module
実行結果は以下のようになります。
敬称が含まれています。
このコードの中にある $ は、アンカーと呼ばれる特殊な記号で、「文字列の末尾」を指します。つまり「様$」というパターンは、「最後が『様』で終わっているもの」という意味になります。このように、記号を組み合わせることで条件を細かく指定できるのが正規表現の魅力です。
4. 数字だけを抜き出してみよう(Match)
次に、文章の中から特定のパターンに一致する部分だけを抜き出す方法を学びましょう。これには Match(マッチ) という道具を使います。例えば、商品コードや金額など、文章の中に埋もれている数字だけを取り出したい時に非常に便利です。
正規表現で「数字」を表現するには \d という記号を使います。また、+ という記号を後ろに付けると「1つ以上の連続した」という意味になります。つまり \d+ は「1つ以上続く数字の塊」を探してね、という命令になります。実際のプログラムを見てみましょう。
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim text As String = "商品の価格は1280円です。"
Dim pattern As String = "\d+" ' \dは数字、+は1回以上の繰り返し
Dim m As Match = Regex.Match(text, pattern)
If m.Success Then
Console.WriteLine("見つかった数字: " & m.Value)
End If
End Sub
End Module
実行結果は以下のようになります。
見つかった数字: 1280
m.Success は、もしパターンに合うものが見つかったら、という意味です。そして m.Value で、実際に見つかった文字を取り出すことができます。複雑な文章の中から、必要な情報だけをピンセットでつまみ上げるように取り出せるので、データの整理がとても楽になります。
5. 複数の該当箇所をすべて見つける(Matches)
文章の中に、探したいパターンが複数ある場合はどうすればよいでしょうか。Match は最初に見つかった1つだけを教えてくれますが、Matches(マッチーズ) を使うと、一致する箇所をすべてリストにして返してくれます。
例えば、会議の議事録の中から「【重要】」と書かれた部分をすべて抜き出したい場合などに使えます。取り出した結果は、コレクション(データの集まり)として扱われるので、For Each(フォー・イーチ)という命令を使って、順番に中身を表示させることができます。
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim diary As String = "今日は02月06日。明日は02月07日です。"
Dim pattern As String = "\d{2}月\d{2}日" ' 2桁の数字月、2桁の数字日
Dim mc As MatchCollection = Regex.Matches(diary, pattern)
Console.WriteLine("日付をすべて抽出します:")
For Each m As Match In mc
Console.WriteLine(m.Value)
Next
End Sub
End Module
実行結果は以下のようになります。
日付をすべて抽出します:
02月06日
02月07日
ここで使った \d{2} というのは、「数字がちょうど2回繰り返される」という意味です。このように、回数を指定することで「3桁の郵便番号」や「4桁の西暦」といった条件も正確に表現できるようになります。
6. 文字を別のパターンに置き換える(Replace)
正規表現のもう一つの得意技が、Replace(リプレイス)、つまり文字の置き換えです。普通の置き換えと違うのは、「パターンに合うものを、一気に変える」ことができる点です。例えば、不適切な言葉を伏せ字にしたり、データの形式を整えたりする時に大活躍します。
以下の例では、文章の中にある複数の電話番号(のような数字の羅列)を、プライバシー保護のために一括で「[電話番号]」という文字に置き換えてみます。複数の場所に散らばっていても、一度の命令で全て置き換わるので非常に効率的です。
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim secretText As String = "私の番号は090-1234-5678です。予備は080-9876-5432です。"
Dim pattern As String = "\d{3}-\d{4}-\d{4}"
Dim result As String = Regex.Replace(secretText, pattern, "[電話番号]")
Console.WriteLine("加工後の文章:")
Console.WriteLine(result)
End Sub
End Module
実行結果は以下のようになります。
加工後の文章:
私の番号は[電話番号]です。予備は[電話番号]です。
普通なら「090...」を探して置き換え、「080...」を探して置き換え…と何度も作業が必要ですが、正規表現なら「数字3桁-4桁-4桁の形のもの」というルールを指定するだけで、一気にお掃除完了です。これが正規表現のパワーです。
7. よく使われる便利な記号(メタ文字)
これまでに $ や \d などの記号が出てきましたが、これらはメタ文字と呼ばれます。これを知っておくと、作れるパターンの幅がぐんと広がります。初心者の方が最初に知っておくと便利なものを表にまとめました。これらは正規表現の「単語」のようなものです。
| 記号 | 意味 | 使い方の例 |
|---|---|---|
| . (ドット) | 何でもいい1文字 | 「あ.い」は「あおい」「あかい」に合う |
| \d | 数字(0~9) | 郵便番号や金額の検索に |
| \w | 英数字やアンダーバー | ユーザーIDのチェックなどに |
| ^ (ハット) | 行の始まり | 「^こんにちは」は冒頭の挨拶を探す |
| $ (ドル) | 行の終わり | 語尾のチェックに |
| * (アスタ) | 0回以上の繰り返し | あってもなくても良い文字に |
これらの記号は、一見すると暗号のように見えるかもしれませんが、パズルを組み立てるように少しずつ試していくと、だんだん意味が読み解けるようになってきます。最初は「数字は \d」ということだけでも覚えておけば、それだけで立派な正規表現の使い手になれます。
8. 正規表現を使うときの注意点
最後に、正規表現を使う際の注意点をお伝えします。正規表現は非常に便利ですが、パターンを複雑にしすぎると、後で自分が見た時に「これ、どういう意味だったっけ?」と混乱してしまうことがあります。いわゆる「書けるけれど読めない」状態です。初心者の方は、最初から完璧で複雑なパターンを作ろうとせず、小さなパターンからコツコツ試していくのが上達の近道です。
また、正規表現の処理は、あまりにも膨大な文章に対して複雑すぎるパターンを適用すると、パソコンの動作が少し遅くなることがあります。といっても、日常的な事務作業や数千行程度のデータ処理であれば全く問題ありません。まずは、身近なデータのチェックや抽出から、この便利な魔法を取り入れてみてください。VB.NETでの文字列操作が、今までよりずっと楽しく、効率的になるはずです。