代表

ご訪問いただきありがとうございます。

このブログでは、弊社代表が日々の開発業務の中で学んだことや、調べた内容、実際にハマったことなどを、備忘録としてまとめています。
また、技術内容を整理し、分かりやすく言語化するトレーニングも兼ねて記事を作成しています。

弊社では、
FileMakerによる業務システム開発、
Windows CE端末向けアプリケーション開発、
WordPressを利用したホームページ制作などを行っております。

同じような課題で困っている方の参考になれば幸いです。
尚、記事の作成には一部AIの助けを借りています。

Regex.IsMatch 関数とは

VB.NET(Visual Basic)における Regex.IsMatch(str, pattern) は、「指定した文字列(str)の中に、正規表現パターン(pattern)に一致する部分があるかどうか」を判定する関数です。

結果は True(一致する部分がある)または False(一致する部分がない)の真偽値(Boolean)で返ってきます。

使い方

ユーザーの入力チェック(バリデーション)で使う場合。
例えば、「入力された文字がすべて数字かどうか」をチェックしたい場合、以下のように書きます。

</>VB.NET
'使うためにはコレが必要
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$” のように書く必要があります。

大文字・小文字を区別しないで比較したいとき

デフォルトでは大文字と小文字を厳密に区別します。区別したくない(例えば Aa も同じとみなす)場合は、第3引数に RegexOptions.IgnoreCase を指定します。

</>VB.NET
' 大文字小文字を無視して「abc」が含まれるかチェック 
If Regex.IsMatch(str, "abc", RegexOptions.IgnoreCase) Then
    ' ... 
End If

事前にインポートが楽

この関数を使うには、ファイルの最上部に Imports System.Text.RegularExpressions を書いておく必要があります。
もし書かない場合は、省略せずに System.Text.RegularExpressions.Regex.IsMatch(str, pattern) と書く必要があります。

代表

ココからは実際のパターンで、解説です。

実際のパターンで解説

まずは上記のPatternが”^\d+$”を解説

</>VB.NET

Dim pattern As String = “^\d+$”

このパターンは「対象の文字列が『すべて半角数字(1文字以上)』であるかどうか」をチェック(完全一致)します。

ユーザーに入力してもらった電話番号(ハイフンなし)や、郵便番号、年齢、金額などのフィールドが正しく数字だけで入力されているかを検証する(バリデーション)ときに使います。

パターンの詳細な意味

この正規表現を分解すると、以下のような意味になります。

^

文字列の先頭からスタートすることをしまします。

\d

「任意の半角数字(0から9までのどれか1文字)」を表す特殊な記号(メタ文字)です。

  • 画面上では\dが¥dを表示されつ事がありますが、意味は同じです。
  • [0-9] と書くのと同じ意味になります。
+

直前の文字(ここでは 数字)が1文字以上、何文字でも繰り返すことを示します。

$

文字列の末尾であることを示します。

先頭の ^ と末尾の $ で挟んでいるため、「文字列のどこかに数字が含まれているか」ではなく、「最初から最後まで、1文字の例外もなくすべて数字で埋め尽くされているか」をチェックすることになります。

Trueになる例

すべて半角数字だけで構成されており、1文字以上あるものが True になります。

  • "1" (1文字の数字)
  • "12345" (5文字の数字)
  • "090123456789" (長めの数字、頭のゼロも問題なくOK)
Falseになる例

数字以外の文字や、空白、あるいは文字自体が存在しない場合は False になります。

  • "123.45"ドットが含まれている→整数チェックとしては機能する)
  • " 123"スペース/空白が含まれている)
  • "123a"英字などが混ざっている)
  • "123"全角文字が含まれている)
  • "" (空文字。 + は1文字以上を要求するため)

桁数も一緒に制限したい場合は?

もし「すべて数字」に加えて、「文字数は◯桁〜◯桁まで」という制限も同時にかけたい場合は、今回の + の部分を {最小桁,最大桁} に置き換えます(前回の文字数制限と同じ考え方です)。

</>VB.NET

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)の隣にそのまま半角スペースを入れます

</>VB.NET

Dim pattern As String = “^[\d ]+$”

[…]

文字列クラス

Trueになる例

以下のような文字列は、「半角数字、または半角スペース」だけで構成されているため True になります。

  • "123 456" (真ん中に半角スペース)
  • " 123" (先頭の半角スペース)
Falseになる例

以下のような全角スペースが混ざっていると False になります。

  • "123 456"全角スペース)

全角スペースやタブも含めて許可するには?

全角のスペースが入ってもエラーにしたくない」「タブ文字も空白として認めたい」という場合は、正規表現で空白全般を表す \s(小文字のs)を使います。

</>VB.NET

Dim pattern As String = “^[\d\s]+$”

\s は「スペース(半角/全角)」「タブ文字」「改行」など、あらゆる空白文字にマッチする便利な記号です。
これを数字(\d)と一緒に括弧に入れることで、「数字か空白なら何でもOK」というルールになります。

\s

空白文字「スペース(半角/全角)」「タブ文字」「改行」

空白応用!「文字と文字の間」だけ空白を許可するには?

ここまでの書き方( ^[\d\s]+$ )だと、" " のような「スペースだけで数字が1文字もない文字列」も True になってしまいます。

数字の間にスペースを挟むのを許可する(例:電話番号の区切りなど)

「数字は必須で、その間や前後にスペースがあっても良い」という厳密なチェックにしたい場合

</>VB.NET

Dim pattern As String = “^\d+(\s\d+)*$”

*

0文字以上

まず、数字の塊があり、その後に「空白+数字の塊」というセットが0回以上繰り返す

Trueになる例
  • "123 456 789" (真ん中に半角スペース)
Falseになる例
  • " " (数字がない)

数字の前後(先頭や末尾)だけ空白を許可する

</>VB.NET

Dim pattern As String = “^\s*\d+\s*$”

先頭と末尾に空白があってもなくても良いが、真ん中には数字が必須。

Trueになる例
  • " 123456 "

用途に合わせて、ただスペースを入れるだけの [\d ]+ か、万能な [\d\s]+ かを選択する。

patternが”^[A-Z0-9().-]+$”の場合は?

</>VB.NET

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になる例

以下のような文字列は、指定された文字だけで構成されているため True になります。

  • "ABCD1234" (英大文字と数字のみ)
  • "A-123(B).C" (記号も含めてすべて対象内)
  • "123" (数字のみでもOK)
  • "-" (指定された記号1文字でもOK)
Falseになる例

以下のような文字が1文字でも混ざっていると False になります。

  • "abcd123"小文字が含まれている)
  • "A 123"スペース/空白が含まれている)
  • "A_123"アンダースコアなど、指定外の記号が含まれている)
  • "A123#"シャープなど、指定外の記号が含まれている)
  • "A123"全角文字が含まれている)
  • "" (空文字。 + は1文字以上を要求するため)

patternを”^[A-Z0-9().\-]{1,6}$”にした場合は?

</>VB.NET

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文字の文字列であること」
という意味になります。

Trueになる例

文字の種類が合っていて、長さが 1文字〜6文字 の範囲に収まっているものが True になります。

  • "A" (1文字)
  • "123456" (6文字)
  • "AB123" (5文字)
Falseになる例

文字の種類が違っているか、文字数が範囲外(0文字、または7文字以上)のものは False になります。

  • "" (0文字:文字数が足りない
  • "ABCDEFG" (7文字:文字数が多すぎる
  • "abc" (3文字ですが、小文字がはいっている)
  • "A 123" (3文字ですが、スペースが入っている)

前回のパターン + と今回の {1,6} の違い

  • 前回の + は、「1文字以上なら何文字でもワイのワイの(100文字でも1000文字でもOK)」でした。
  • 今回の {1,6} は、「1文字〜6文字ぴったりに収めてね」という文字数制限(上限)がついた形になります。

桁数を限定する場合は?

</>VB.NET

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文字」という意味にひっくり返ります。

「特定の文字を除外」したい場合

例えば、「半角英数字なら何でもいいけれど、ハイフン(-)とドット(.)だけは絶対に使わせたくない」という場合、以下のように書きます。

</>VB.NET

Dim pattern As String = “^[^.\-]{1,6}$”

TrueとFalseになる例
  • "ABC12" ’True (ドットもハイフンもないのでOK)
  • "AB-12" ’False (除外対象のハイフンがはいっているのでNG)

「数字以外を全部除外(=数字のみ)」という考え方

これまで登場した「数字のみ(^\d+$)」というパターンも、見方を変えれば「数字以外の文字をすべて除外する」という動きをしています。
実は、正規表現の記号(メタ文字)は大文字にすると「〜以外」という意味になるルールがあります。

大文字にすると「〜以外」になる例
\d(小文字)

半角数字(0~9)

\D(大文字)

数字以外のすべての文字(アルファベット、日本語、記号、空白など)

\s(小文字)

空白文字(スペースやタブ)

\S(大文字)

空白以外のすべての文字

数字以外が混ざっていたらエラー」をシンプルに判定する

</>VB.NET

Dim pattern As String = “\D” ‘ 意味:「数字以外の文字」がどこかにあるか?

If Regex.IsMatch(str, pattern) Then
‘ True の場合 = 数字以外のゴミ(文字や記号)が混ざっている!
Console.WriteLine(“エラー:数字以外の文字が含まれています。”)
Else
‘ False の場合 = 数字以外の文字が1文字もない(=すべて数字、または空)
Console.WriteLine(“すべて数字です。”)
End If

※この判定の場合、文字列のどこかに1文字でも文字や記号があればヒットするため、^$ で囲む必要がなくなります。

数字だけど、0だけ、000だけのように0しか存在しない文字列は弾きたい場合は?

「すべて数字だけど、0だけ、または000のように0しか存在しない文字列は弾きたい」という場合は、「先頭から末尾まで数字だけ」という条件に、「少なくとも1つは1〜9の数字が含まれていること」という条件をブレンドします。

</>VB.NET

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文字以上)」を最後までチェックして締めくくります。

Trueになる例

「すべて数字」であり、なおかつ「0以外の数字が1つでも入っている」ものが True になります。

  • "1" (OK)
  • "100" (0以外の1が含まれているのでOK)
  • "00050" (途中に5が含まれているのでOK)
  • "12345" (すべて1から9なのでOK)
Falseになる例

数字だけで構成されていても、0しか使われていないものは Falseになります。

  • "0" (0しかない)
  • "00" (0しかない)
  • "0000000" (0が何個あってもNG)
  • "000A0" (数字以外が入ってもNG)
  • “”(空白NG)

Patternの例

</>VB.NET

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}$ \ は不要!(一番後ろにあるため)

私が” \ “をあえて付与する理由

「無くてもいいなら、なぜ付いているの?」と思いますよね。これには以下のような理由があります。

安全第一

「ハイフンは特殊文字だから、どこにあってもとりあえず \ を付けておけば間違いが起きない」という安全策です。

可読性のため

パッとコードを見たときに、「これは文字としてのハイフンだよ」と他のプログラマーに明示するために、あえて残しているケースです。

消してもプログラムの動きは1ミリも変わりません。ただ、付いていても間違いではないので、既存のコードを修正しているのであれば、そのまま残しておくのも一つの方法です。