正規表現の使い方
最初にざっくりと正規表現を説明します。
とある文章の中から
『今日は〇曜日』
っと言う文字列を探したいとします。
曜日ですのでバリエーションは、7つありますね。
- 今日は月曜日
- 今日は火曜日
- 今日は水曜日
- 今日は木曜日
- 今日は金曜日
- 今日は土曜日
- 今日は日曜日
7種類の内どれか存在するかをチェックする場合Contains関数を使うと7個必要です。
サンプルコード
Module Module1 Sub Main() Dim str As String = "おはよう、今日は水曜日です。" Console.WriteLine(str.Contains("月曜日です。")) 'False Console.WriteLine(str.Contains("火曜日です。")) 'False Console.WriteLine(str.Contains("水曜日です。")) 'True Console.WriteLine(str.Contains("木曜日です。")) 'False Console.WriteLine(str.Contains("金曜日です。")) 'False Console.WriteLine(str.Contains("土曜日です。")) 'False Console.WriteLine(str.Contains("日曜日です。")) 'False End Sub End Module
7つくらいなら1つづ検索すればなんとかなりますが、もっとバリエーションが多い場合、例えば
『今日は〇〇日』
だったらどうでしょうか?
日にちなので31通りあります。
31通りも書くのは流石に現実的ではないですね。
そんな時に使えるのが正規表現です。
どんな感じなんのかと言えば、「今日は〇曜日」を例にすると
- 「今日は」で始まる
- 「曜日」で終わる
- 間に入るのは、「月・火・水・木・金・土・日」のどれか
というパターンを持っています。
このパターンを指定してあげるのが正規表現です。
具体的にはこんな感じのコードになります。
サンプルコード
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはよう、今日は水曜日です。" Console.WriteLine(IsMatch(str, "今日は(月|火|水|木|金|土|日)曜日")) 'True End Sub End Module
スッキリして分かりやすいですね。
IsMatch メソッド
正規表現と言っても使い方は色々あるのですが、ここでは、
パターンにハマってますか?ハマってませんか?を問える。IsMatch メソッドについて説明します。
IsMatch メソッドは System.Text.RegularExpressions.Regex クラスのメソッドです。
System.Text.RegularExpressions.Regex をインポートするか、
System.Text.RegularExpressions.Regex.IsMatch とフルパス指定すると利用できます。
戻り値に真(TRUE)偽(FALSE)を返します。
ちなみに「Regex」は正規表現という意味で「IsMatch」はマッチしていますか?という意味です。
日本語で言えば、「正規表現」クラスの「マッチしていますか?」メソッドなので、そのまんまの意味ですね。
メタ文字
メタとは、「高次の」「超える」とかいう意味で、それに文字が付いて「文字を超越した文字」と言う意味です。
もっと平たく言えば、意味を持った文字です。
例えば、「\d」 は円マークとdのことではなく何か数字(多分dはdecimalの頭文字)を意味します。
文字の種類の指定
文字の種類を指定するメタ文字です。
記号 | 機能 |
---|---|
\d | 0-9 の数字 1 文字 |
\D | \d 以外の 1 文字 |
\w | 記号以外の1文字 |
\W | \w 以外の 1 文字 |
\s | スペース、タブ、改行など |
\S | \s 以外の 1 文字 |
. | なにか文字 1 文字 |
大文字なのか小文字なのかも意味があるので注意が必要です。
量指定子
文字の回数を指定するメタ文字です。
量指定子 | 機能 |
---|---|
{n} | n 個連続する |
{min,max} | min 以上、max 以下の個数連続する |
{min,} | min 以上の個数連続する |
? | {0,1} と同義 |
+ | {1,} と同義 |
* | {0,} と同義 |
アンカー
文字の区切りを指定するメタ文字です。
ちなみにアンカーは船の碇のことです。
アンカー | 機能 |
---|---|
^ | 行の先頭 |
$ | 行の末尾 |
\bで挟む | 単語の境界 |
\Bで挟む | \bの逆 |
単語の境界だけでは難しいと思うので補足します。
文章の一部としてではなく独立した文字として存在するかどうかを問うときに使います。
サンプルコード
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str1 As String = "おはようございます。今日は水曜日です。" Dim str2 As String = "おはようございます。今日は'水曜日'です。" Console.WriteLine(IsMatch(str1, "\b水曜日\b")) 'False Console.WriteLine(IsMatch(str2, "\b水曜日\b")) 'True End Sub End Module
水曜日が独立した文字であることが重要です。
水曜または水曜日を検索したい場合は、”\b水曜日?\b” とします。
\Bは\bの逆なので、独立した文字でない場合に検索出来ます。
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str1 As String = "おはようございます。今日は水曜日です。いい天気です。" Dim str2 As String = "おはようございます。今日は'水曜日'です。いい天気です。" Console.WriteLine(IsMatch(str1, "\B水曜日\B")) 'True Console.WriteLine(IsMatch(str2, "\B水曜日\B")) 'False End Sub End Module
選択子
AかBか、またはCというように候補から選択する場合に使うメタ文字です。
|を間に入れると「または」という意味になります。
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはようございます。今日は水曜日です。いい天気です。" Console.WriteLine(IsMatch(Str, "今日は(月|火|水|木|金|土|日)曜日です。")) 'True End Sub End Module
文字クラス
選択肢と同じように使えるメタ文字です。
[]で囲むと[]内にある文字のどれか 1 文字を検索できます。
[月火水]とすると「月」か「火」か「水」のどれか 1 文字にマッチします。(月|火|水)と同じ意味です。
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはようございます。今日は水曜日です。" Console.WriteLine(IsMatch(str, "今日は[月火水木金土日]曜日")) 'True End Sub End Module
否定
指定した文字以外にマッチするか問いたい場合に使うメタ文字です。
文字クラスの[の直後に^を置くと否定を表現できます。
[^月火水]とすると「月」または「火」または「水」以外を表現できます。
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはようございます。今日は水曜日です。" Console.WriteLine(IsMatch(str, "今日は[^月火水]曜日です。")) 'False Console.WriteLine(IsMatch(str, "今日は[^木金土日]曜日です。")) 'True End Sub End Module
文字コードの範囲を指定
文字コードを範囲で指定することが出来るメタ文字です。
文字クラスの中で–で文字コードの範囲を指定出来ます。
[1-5] (1|2|3|4|5)と同じ意味
[a-f] (a|b|c|d|e|f)と同じ意味
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはようございます。今日は5日です。" Console.WriteLine(IsMatch(str, "今日は[1-5]日です。")) 'True Console.WriteLine(IsMatch(str, "今日は[6-9]日です。")) 'False End Sub End Module
改行とタブ
改行またはタブを指定するメタ文字です。
改行コードは Windows や macOS などのシステムによって異なります。
タブと改行コード | 説明 |
---|---|
\t | タブ |
\r\n | 改行(Windows) |
\r | 改行(v9 までの macOS ) |
\n | 改行(Unix、v10 以降の macOS) |
\r\n|\r|\n | 改行(すべて) |
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Dim str As String = "おはようございます。" & vbCrLf & "今日は" & vbTab & "水曜日です。" Console.WriteLine(str) Console.WriteLine(IsMatch(str, "\t")) 'True Console.WriteLine(IsMatch(str, "\r\n")) 'True End Sub End Module
よくある正規表現のサンプルコード
よくあるであろう正規表現のサンプルコードです。
郵便番号
"^\d{3}-\d{4}$"
数字3桁で始まって次に「-」ハイフンが存在し、数字4桁で終わるパターンであるか問い合わせます。
Imports System.Text.RegularExpressions.Regex Module Module1 Sub Main() Console.WriteLine(IsMatch("123-4567", "^\d{3}-\d{4}$")) 'True Console.WriteLine(IsMatch("1a3-4567", "^\d{3}-\d{4}$")) 'False Console.WriteLine(IsMatch("123-45678", "^\d{3}-\d{4}$")) 'False Console.WriteLine(IsMatch("13-4567", "^\d{3}-\d{4}$")) 'False Console.WriteLine(IsMatch("1234567", "^\d{3}-\d{4}$")) 'False End Sub End Module
コメント