
代表
ご訪問いただきありがとうございます。
このブログでは、弊社代表が日々の開発業務の中で学んだことや、調べた内容、実際にハマったことなどを、備忘録としてまとめています。
また、技術内容を整理し、分かりやすく言語化するトレーニングも兼ねて記事を作成しています。
弊社では、
FileMakerによる業務システム開発、
Windows CE端末向けアプリケーション開発、
WordPressを利用したホームページ制作などを行っております。
同じような課題で困っている方の参考になれば幸いです。
尚、記事の作成には一部AIの助けを借りています。
Regex.IsMatch 関数とは
VB.NET(Visual Basic)における Regex.IsMatch(str, pattern) は、「指定した文字列(str)の中に、正規表現パターン(pattern)に一致する部分があるかどうか」を判定する関数です。
結果は True(一致する部分がある)または False(一致する部分がない)の真偽値(Boolean)で返ってきます。
使い方
ユーザーの入力チェック(バリデーション)で使う場合。
例えば、「入力された文字がすべて数字かどうか」をチェックしたい場合、以下のように書きます。
'使うためにはコレが必要
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim str As String = "12345"
Dim pattern As String = "^\d+$" ' 「行頭から行末まで全て数字」という意味のパターン
' 判定を行う
If Regex.IsMatch(str, pattern) Then
Console.WriteLine("すべて数字です!") ' Trueの場合
Else
Console.WriteLine("数字以外の文字が含まれています。") ' Falseの場合
End If
End Sub
End Module
引数の意味
- str (String)
検索対象となる元の文字列
- pattern (String)
検索したい条件を表す正規表現パターンです。
使うときの注意点
完全一致でなく部分一致が基本
Regex.IsMatch は、文字列のどこか一部でもパターンにヒットすれば True を返します。
- 例えば、パターンを “abc” にした場合、
strが"abcdefg"でも True になります。 - もし文字列全体がぴったり一致するか調べたい場合は、パターンの先頭に
^(行頭)、末尾に$(行末)をつけて、”^abc$” のように書く必要があります。
大文字・小文字を区別しないで比較したいとき
デフォルトでは大文字と小文字を厳密に区別します。区別したくない(例えば A も a も同じとみなす)場合は、第3引数に RegexOptions.IgnoreCase を指定します。
' 大文字小文字を無視して「abc」が含まれるかチェック
If Regex.IsMatch(str, "abc", RegexOptions.IgnoreCase) Then
' ...
End If
事前にインポートが楽
この関数を使うには、ファイルの最上部に Imports System.Text.RegularExpressions を書いておく必要があります。
もし書かない場合は、省略せずに System.Text.RegularExpressions.Regex.IsMatch(str, pattern) と書く必要があります。

代表
ココからは実際のパターンで、解説です。
実際のパターンで解説
まずは上記のPatternが”^\d+$”を解説
Dim pattern As String = “^\d+$”
このパターンは「対象の文字列が『すべて半角数字(1文字以上)』であるかどうか」をチェック(完全一致)します。
ユーザーに入力してもらった電話番号(ハイフンなし)や、郵便番号、年齢、金額などのフィールドが正しく数字だけで入力されているかを検証する(バリデーション)ときに使います。
パターンの詳細な意味
この正規表現を分解すると、以下のような意味になります。
- ^
文字列の先頭からスタートすることをしまします。
- \d
「任意の半角数字(0から9までのどれか1文字)」を表す特殊な記号(メタ文字)です。
- 画面上では\dが¥dを表示されつ事がありますが、意味は同じです。
- [0-9] と書くのと同じ意味になります。
- +
直前の文字(ここでは 数字)が1文字以上、何文字でも繰り返すことを示します。
- $
文字列の末尾であることを示します。
すべて半角数字だけで構成されており、1文字以上あるものが True になります。
"1"(1文字の数字)"12345"(5文字の数字)"090123456789"(長めの数字、頭のゼロも問題なくOK)
数字以外の文字や、空白、あるいは文字自体が存在しない場合は False になります。
"123.45"(ドットが含まれている→整数チェックとしては機能する)" 123"(スペース/空白が含まれている)"123a"(英字などが混ざっている)"123"(全角文字が含まれている)""(空文字。+は1文字以上を要求するため)
桁数も一緒に制限したい場合は?
もし「すべて数字」に加えて、「文字数は◯桁〜◯桁まで」という制限も同時にかけたい場合は、今回の + の部分を {最小桁,最大桁} に置き換えます(前回の文字数制限と同じ考え方です)。
Dim pattern As String = “^\d{4}$”
Dim pattern As String = “^\d{3,4}$”
Dim pattern As String = “^\d{1,10}$”
- ^\d{4}$
ぴったり4桁の数字(例:暗証番号など)
- ^\d{3,4}$
3桁または4桁(3桁以上、4桁以下)の数字
- ^\d{1,10}$
1桁以上、10桁以下の数字
空白文字(半角)を許可するには?
例えは、数字のみの制限に空白文字を許可するには、文字クラス( […] )を使い、数字(\d)の隣にそのまま半角スペースを入れます。
Dim pattern As String = “^[\d ]+$”
- […]
文字列クラス
以下のような文字列は、「半角数字、または半角スペース」だけで構成されているため True になります。
"123 456"(真ん中に半角スペース)" 123"(先頭の半角スペース)
以下のような全角スペースが混ざっていると False になります。
"123 456"(全角スペース)
全角スペースやタブも含めて許可するには?
全角のスペースが入ってもエラーにしたくない」「タブ文字も空白として認めたい」という場合は、正規表現で空白全般を表す \s(小文字のs)を使います。
Dim pattern As String = “^[\d\s]+$”
\s は「スペース(半角/全角)」「タブ文字」「改行」など、あらゆる空白文字にマッチする便利な記号です。
これを数字(\d)と一緒に括弧に入れることで、「数字か空白なら何でもOK」というルールになります。
- \s
空白文字「スペース(半角/全角)」「タブ文字」「改行」
空白応用!「文字と文字の間」だけ空白を許可するには?
ここまでの書き方( ^[\d\s]+$ )だと、" " のような「スペースだけで数字が1文字もない文字列」も True になってしまいます。
数字の間にスペースを挟むのを許可する(例:電話番号の区切りなど)
「数字は必須で、その間や前後にスペースがあっても良い」という厳密なチェックにしたい場合
Dim pattern As String = “^\d+(\s\d+)*$”
- *
0文字以上
まず、数字の塊があり、その後に「空白+数字の塊」というセットが0回以上繰り返す
"123 456 789"(真ん中に半角スペース)
" "(数字がない)
数字の前後(先頭や末尾)だけ空白を許可する
Dim pattern As String = “^\s*\d+\s*$”
先頭と末尾に空白があってもなくても良いが、真ん中には数字が必須。
" 123456 "
patternが”^[A-Z0-9().-]+$”の場合は?
Dim pattern As String = “^[A-Z0-9().-]+$”
pattern が "^[A-Z0-9().-]+$" のときは、対象の文字列が「指定された特定の文字(英大文字、数字、一部の記号)だけで構成されているか」をチェック(完全一致)することになります。
一言で言うと、「半角の英大文字、数字、丸括弧、ドット、ハイフンだけで書かれた文字列なら True、それ以外の文字が1文字でも入っていれば False」になります。
パターンの詳細な意味
この正規表現を分解すると、以下のような意味になります。
- ^
文字列の先頭からスタートすることをしまします。
- […]
括弧の中に入っている文字のどれか1文字にマッチします。
- A-Z
半角の英大文字(A~Z)
- 0-9
半角の数字(0~9)
- ()
半角の丸括弧( “(” と “)” )
- .
半角のドット( ”.” )
- –
半角のハイフン( “-” )
※括弧の末尾にあるため、範囲でなく文字そのものを意味します。
- +
直前の文字(ここでは
[...]の中身)が1文字以上繰り返すことを示します。- $
文字列の末尾であることを示します。
以下のような文字列は、指定された文字だけで構成されているため True になります。
"ABCD1234"(英大文字と数字のみ)"A-123(B).C"(記号も含めてすべて対象内)"123"(数字のみでもOK)"-"(指定された記号1文字でもOK)
以下のような文字が1文字でも混ざっていると False になります。
"abcd123"(小文字が含まれている)"A 123"(スペース/空白が含まれている)"A_123"(アンダースコアなど、指定外の記号が含まれている)"A123#"(シャープなど、指定外の記号が含まれている)"A123"(全角文字が含まれている)""(空文字。+は1文字以上を要求するため)
patternを”^[A-Z0-9().\-]{1,6}$”にした場合は?
Dim pattern As String = “^[A-Z0-9().\-]{1,6}$”
パターンが “^[A-Z0-9().\-]{1,6}$” に変わると、チェックする文字の種類に加えて、「文字数の制限(1文字以上、6文字以下)」という条件が追加されます。
さらに、細かい部分ですが \- とハイフンの前にバックスラッシュ(エスケープ文字)が入っています。
パターンの詳細な意味
この正規表現を分解すると、以下のような意味になります。
- ^と$
文字列の先頭から末尾まで(完全一致)。
- [A-Z0-9().\-]
使える文字の種類(前回とほぼ同じ)
- A-Z
半角の英大文字(A~Z)
- 0-9
半角の数字(0~9)
- ()
半角の丸括弧( “(” と “)” )
- .
半角のドット( ”.” )
- \-
半角のハイフン( “-” )
※今回は\でエスケープされていますが、意味は文字通りのハイフン文字です。
- {1,6}
【ここが重要】 直前の文字が 「1文字以上、6文字以下」 であることを指定しています。
つまり、この正規表現の意味は、
「半角の英大文字・数字・丸括弧・ドット・ハイフンだけを使って構成された、長さが1〜6文字の文字列であること」
という意味になります。
文字の種類が合っていて、長さが 1文字〜6文字 の範囲に収まっているものが True になります。
"A"(1文字)"123456"(6文字)"AB123"(5文字)
文字の種類が違っているか、文字数が範囲外(0文字、または7文字以上)のものは False になります。
""(0文字:文字数が足りない)"ABCDEFG"(7文字:文字数が多すぎる)"abc"(3文字ですが、小文字がはいっている)"A 123"(3文字ですが、スペースが入っている)
前回のパターン + と今回の {1,6} の違い
桁数を限定する場合は?
Dim pattern As String = “^([A-Z0-9().\-]{13}|[A-Z0-9().\-]{28})$”
「13桁の数字」または「28桁の数字」というように、特定の桁数だけをピンポイントで狙い撃ちして許可したい場合は、正規表現の |(縦棒:オア演算子) を使ってパターンを2つ並べます。
パターンの詳細な意味
この正規表現を分解すると、以下のような意味になります。
- ^と$
文字列の先頭から末尾まで(完全一致)。
- (…)
条件をグループ化
- |
「または(OR)」を意味する非常に重要な記号です。これの左右にあるパターンのどちらかにヒットすればOKという意味になります。
- {13}
ピッタリ13桁
- {28}
ピッタリ28桁
- [A-Z0-9().\-]
使える文字の種類(前回と同じ)
除外文字を指定する場合は?
文字クラス [...] の先頭に ^(ハット記号) をつけると、「括弧の中に書いた文字『以外』のどれか1文字」という意味にひっくり返ります。
「特定の文字を除外」したい場合
例えば、「半角英数字なら何でもいいけれど、ハイフン(-)とドット(.)だけは絶対に使わせたくない」という場合、以下のように書きます。
Dim pattern As String = “^[^.\-]{1,6}$”
"ABC12"’True (ドットもハイフンもないのでOK)"AB-12"’False (除外対象のハイフンがはいっているのでNG)
「数字以外を全部除外(=数字のみ)」という考え方
これまで登場した「数字のみ(^\d+$)」というパターンも、見方を変えれば「数字以外の文字をすべて除外する」という動きをしています。
実は、正規表現の記号(メタ文字)は大文字にすると「〜以外」という意味になるルールがあります。
- \d(小文字)
半角数字(0~9)
- \D(大文字)
数字以外のすべての文字(アルファベット、日本語、記号、空白など)
- \s(小文字)
空白文字(スペースやタブ)
- \S(大文字)
空白以外のすべての文字
数字以外が混ざっていたらエラー」をシンプルに判定する
Dim pattern As String = “\D” ‘ 意味:「数字以外の文字」がどこかにあるか?
If Regex.IsMatch(str, pattern) Then
‘ True の場合 = 数字以外のゴミ(文字や記号)が混ざっている!
Console.WriteLine(“エラー:数字以外の文字が含まれています。”)
Else
‘ False の場合 = 数字以外の文字が1文字もない(=すべて数字、または空)
Console.WriteLine(“すべて数字です。”)
End If
数字だけど、0だけ、000だけのように0しか存在しない文字列は弾きたい場合は?
「すべて数字だけど、0だけ、または000のように0しか存在しない文字列は弾きたい」という場合は、「先頭から末尾まで数字だけ」という条件に、「少なくとも1つは1〜9の数字が含まれていること」という条件をブレンドします。
Dim pattern As String = “^(?=[0-9]*[1-9])[0-9]+$”
または \d を使って
Dim pattern As String = “^(?=\d*[1-9])\d+$”
このパターンの肝(きも)は、前半にある (?=...)(肯定先読み) という特殊な仕掛けです。これは「条件を満たしているか、その場で未来(右側)をチラ見してチェックする」という機能を持っています。
パターンの詳細な意味
この正規表現を分解すると、以下のような意味になります。
- ^と$
文字列の先頭から末尾まで(完全一致)。
- (?=[0-9]*[1-9])
ココが最大の「ポイントチラ見チェック」
- 先頭から右側に向かって、「0~9の数字が何文字か続いた後に([0-9]*)、1~9の数字([1-9])が少なくとも一つ登場するか?」を視線だけ送ってチェック
- もし”0000″のように1~9が1つもなければ、この時点で即座にFalseになる
- [0-9]+$
チラ見チェックを無事通過したら、改めて文字列全体が「0〜9の数字だけでできているか(1文字以上)」を最後までチェックして締めくくります。
「すべて数字」であり、なおかつ「0以外の数字が1つでも入っている」ものが True になります。
"1"(OK)"100"(0以外の1が含まれているのでOK)"00050"(途中に5が含まれているのでOK)"12345"(すべて1から9なのでOK)
数字だけで構成されていても、0しか使われていないものは Falseになります。
"0"(0しかない)"00"(0しかない)"0000000"(0が何個あってもNG)"000A0"(数字以外が入ってもNG)- “”(空白NG)
Patternの例
Dim pattern As String = “^[A-Z]\d{3}$”
‘ 1文字目がアルファベット、2から4文字目が数字
Dim pattern As String = “^\d{11,12}$”
‘ 数字のみの11桁または12桁(電話番号、携帯番号、マイナンバーなど)
” \ ”について
” \ “を付与する場合と、付与しない場合
結論から言うと、今回の ^[A-Z0-9().\-]{1,6}$ というパターンの場合、「 \ は無くても全く同じ意味」になります。
つまり、以下の2つは VB.NET で全く同じ挙動をします。
- ^[A-Z0-9().\-]{1,6}$ ( \ あり)
- ^[A-Z0-9().-]{1,6}$ ( \ なし)
” \ “を付与しなくても良いワケ
正規表現において、ハイフン( - )は [A-Z] や [0-9] のように「〜から〜までという範囲」を表す特別な意味を持っています。そのため、普通は「文字としてのハイフンそのもの」を表したいとき、打ち消すために \- とエスケープ(\ を付与)します。
しかし、[...](文字クラス)の「一番最後」にハイフンを書いた場合だけは、例外的にエスケープが不要というルールがあります。
括弧の末尾にある - は、後ろに「〜まで」と続く文字がもう存在しないため、正規表現のエンジンが自動的に「あ、これは範囲じゃなくて、文字通りのハイフン文字のことだな」と賢く判断してくれるからです。
” \ “を絶対に消してはいけない(位置を変える)ケース
もし、ハイフンの位置を括弧の真ん中あたりに移動させる場合は、\ が絶対に必要になります。
- ^[A-Z0-9(\-).]{1,6}$ \ が必要!(無いと
(から.までの範囲という意味になってしまい、エラーになるか意図しない挙動になります) - ^[A-Z0-9().-]{1,6}$ \ は不要!(一番後ろにあるため)
私が” \ “をあえて付与する理由
「無くてもいいなら、なぜ付いているの?」と思いますよね。これには以下のような理由があります。
安全第一
「ハイフンは特殊文字だから、どこにあってもとりあえず \ を付けておけば間違いが起きない」という安全策です。
可読性のため
パッとコードを見たときに、「これは文字としてのハイフンだよ」と他のプログラマーに明示するために、あえて残しているケースです。
