C# Regex.IsMatchの使い方を完全解説|正規表現の判定・一致しない原因・実用例まで
はじめに
C#で文字列の入力チェックや形式判定を行うとき、Regex.IsMatch は非常に便利です。
たとえば「数字だけか」「メールアドレス形式か」「特定の単語が含まれているか」といった判定を、1行でまとめて書けます。
一方で、Regex.IsMatch は「思った通りに一致しない」「なぜか true になる」といったつまずきも起きやすいメソッドです。
その原因の多くは、正規表現の部分一致・完全一致の違い、エスケープの書き方、改行や空白の混入、RegexOptions の使い方にあります。
この記事では、c# regex.ismatch の基本から、よく使うパターン、一致しない原因、実用例、注意点までを順番に整理して解説します。
初心者でもそのまま使えるサンプルを中心に、実務で役立つ考え方までカバーします。
1. C#のRegex.IsMatchとは?正規表現で一致判定する基本
Regex.IsMatch は、文字列が正規表現パターンに一致するかどうかを判定するメソッドです。
一致すれば true、一致しなければ false を返します。
正規表現そのものは「文字列の形を表す記法」です。
たとえば \d+ は「1文字以上の数字」、^[a-zA-Z]+$ は「英字だけで構成された文字列」を表します。
1-1. Regex.IsMatchでできること
Regex.IsMatch でできる代表的なことは、次のような判定です。
文字列に特定の文字列が含まれているかを調べる。
数字だけ、英字だけ、英数字だけなどの形式を調べる。
メールアドレス、電話番号、郵便番号、URLなどの入力形式をチェックする。
パスワードに必要な条件を満たしているか確認する。
禁止文字や禁止語句が含まれていないかを確認する。
単純な文字列検索で済むなら Contains や StartsWith でも足ります。
しかし、複雑な条件をまとめて表現したいときは Regex.IsMatch が強力です。
1-2. 戻り値true/falseの意味
Regex.IsMatch の戻り値は単純です。
true は、入力文字列がパターンに少なくとも1か所一致したことを意味します。false は、一致する部分が見つからなかったことを意味します。
ここで重要なのは、true が「文字列全体が一致した」ことを意味するとは限らない点です。Regex.IsMatch("abc123", @"\d+") は true になります。
これは文字列全体が数字だからではなく、123 という一部がパターンに一致しているからです。
完全一致をしたい場合は、後で解説する ^ と $ を使います。
1-3. Regex.IsMatchを使うために必要なusing
Regex クラスは System.Text.RegularExpressions 名前空間に含まれています。
そのため、使うには次の using が必要です。
C#using System.Text.RegularExpressions;
これを忘れると、Regex が見つからないというコンパイルエラーになります。
1-4. Contains・StartsWith・Match・Matchesとの違い
Regex.IsMatch は便利ですが、すべての判定に使うべきではありません。
それぞれの違いを理解しておくと、不要に複雑なコードを避けられます。
Contains は、指定した文字列が含まれているかを調べます。
正規表現ではなく、単純な部分一致です。
StartsWith は、先頭が指定文字列で始まるかを調べます。EndsWith は、末尾が指定文字列で終わるかを調べます。
Regex.Match は、最初に見つかった一致箇所の詳細情報を返します。
一致の有無だけでなく、どこに一致したかも必要なときに使います。
Regex.Matches は、複数の一致箇所をすべて取得します。
文字列の中に複数の該当箇所がある場合に使います。
一方で Regex.IsMatch は、判定だけをしたいときに最もシンプルです。
「一致するかどうかだけ」が必要なら、まず Regex.IsMatch を検討するとよいでしょう。
2. Regex.IsMatchの基本構文と使い方
Regex.IsMatch は、静的メソッドとしても、Regex インスタンスのメソッドとしても使えます。
まずは基本構文を押さえましょう。
2-1. Regex.IsMatch(input, pattern)の引数
最もよく使う形は次のとおりです。
C#Regex.IsMatch(input, pattern)
input は判定したい文字列です。pattern は正規表現パターンです。
オーバーロードによっては RegexOptions を指定できたり、タイムアウトを指定できたりします。
実務では、必要に応じてオプションも一緒に考えると安全です。
2-2. 最小コードで見る基本サンプル
たとえば、文字列に数字が含まれているかを確認するには次のように書けます。
C#using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "abc123";
bool result = Regex.IsMatch(input, @"\d+");
Console.WriteLine(result); // True
}
}
@"\d+" は、数字が1文字以上続くパターンです。abc123 の中に 123 があるため、結果は true になります。
2-3. staticメソッドで使う方法
Regex.IsMatch は、インスタンスを作らなくても使える静的メソッドです。
使い捨ての判定であれば、この形が最も簡潔です。
C#bool isMatch = Regex.IsMatch("hello", @"^h.*o$");
短い処理や、1回だけのチェックには向いています。
ただし、同じパターンを何度も使う場合は、後述するインスタンス化のほうが扱いやすいことがあります。
2-4. Regexインスタンスを作成して使う方法
正規表現パターンを繰り返し使うときは、Regex オブジェクトを作成して使う方法が便利です。
C#using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
var regex = new Regex(@"^\d+$");
bool isNumber = regex.IsMatch("12345");
Console.WriteLine(isNumber); // True
}
}
この方法は、同じパターンを複数回判定する処理で読みやすくなります。
また、RegexOptions.Compiled などの設定を行いたいときにも向いています。
2-5. @""を使って正規表現を書く理由
C#で正規表現を書くときは、@"..." の形式がよく使われます。
これは「逐語的文字列リテラル」と呼ばれる書き方です。
通常の文字列では、バックスラッシュ \ をエスケープする必要があります。
たとえば "\d+" のように書くと、C# の文字列として \ を解釈します。
一方で @"\d+" と書けば、バックスラッシュをそのまま扱えます。
正規表現は \d や \w のようにバックスラッシュを多用するため、@"" を使うと見やすくなります。
ただし、@"..." ではダブルクォートを含めたい場合に "" と2つ重ねる必要があります。
用途に応じて使い分けるとよいでしょう。
3. Regex.IsMatchでよく使う正規表現パターン
Regex.IsMatch は、実際には「どんなパターンを書くか」が重要です。
ここでは、実務でよく使う基本パターンを紹介します。
3-1. 数字だけを判定する
数字だけを判定するには次のように書きます。
C#Regex.IsMatch(input, @"^\d+$")
^ は先頭、$ は末尾を意味します。
つまり、文字列全体が数字で構成されているかを確認できます。
例:
C#Regex.IsMatch("12345", @"^\d+$") // True
Regex.IsMatch("123a", @"^\d+$") // False
3-2. 英字だけを判定する
英字だけを判定するには次のようにします。
C#Regex.IsMatch(input, @"^[a-zA-Z]+$")
小文字と大文字の両方を含めたいので、a-zA-Z を使います。
英字だけを厳密に許可したい場合に使いやすいパターンです。
3-3. 英数字だけを判定する
英数字だけを判定するなら次のパターンです。
C#Regex.IsMatch(input, @"^[a-zA-Z0-9]+$")
ユーザーIDや簡易コードの形式チェックなどで使われます。
記号を許可したくないときに役立ちます。
3-4. メールアドレス形式を判定する
メールアドレスは非常に複雑な形式を持つため、完全に厳密な正規表現を書くのは難しいです。
ただし、一般的な形式の確認にはある程度使えます。
C#Regex.IsMatch(input, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")
これは「@ と空白を含まず、@ の前後に文字があり、ドメインに . がある」程度の判定です。
厳密すぎる正規表現にこだわるより、用途に合った現実的な判定を優先したほうが保守しやすくなります。
3-5. 電話番号形式を判定する
電話番号の形式は国や用途によって大きく異なります。
日本向けの簡易判定であれば、ハイフンあり・なしを許可する形が使われます。
例:
C#Regex.IsMatch(input, @"^0\d{1,4}-?\d{1,4}-?\d{4}$")
これはあくまで簡易例です。
本番システムでは、入力ルールや業務要件に合わせて調整してください。
3-6. 郵便番号形式を判定する
日本の郵便番号は、一般的に 123-4567 の形式です。
この場合は次のように書けます。
C#Regex.IsMatch(input, @"^\d{3}-\d{4}$")
ハイフンなしの7桁も許可するなら、少し調整します。
C#Regex.IsMatch(input, @"^\d{3}-?\d{4}$")
3-7. URL形式を判定する
URLは非常に多様なので、厳密な判定は難しいです。
ただし、簡易的に http または https から始まるかを確認するなら、次のように書けます。
C#Regex.IsMatch(input, @"^https?://")
http に続く s があってもなくてもよい、という意味です。
入力された文字列がURLっぽいかどうかをざっくり確認する用途に向いています。
3-8. 空文字・空白文字を判定する
空文字や空白だけかどうかを判定したい場合は、次のようにします。
C#Regex.IsMatch(input, @"^\s*$")
^\s*$ は、空白文字が0文字以上続き、それ以外がないことを意味します。
空文字 "" も、スペースだけの文字列も true になります。
ただし、null は別扱いです。null の判定は正規表現ではなく、事前に string.IsNullOrEmpty や string.IsNullOrWhiteSpace を使うのが安全です。
4. 部分一致と完全一致の違いを理解する
Regex.IsMatch で最も大切なのが、部分一致と完全一致の違いです。
ここを誤解すると、「なぜか true になる」という現象が起きます。
4-1. Regex.IsMatchは基本的に部分一致で判定する
Regex.IsMatch は、文字列全体が一致しなくても、どこか一部が一致すれば true を返します。
C#Regex.IsMatch("abc123", @"\d+") // True
この例では、123 の部分が \d+ に一致しています。
そのため、全体として数字でなくても true になります。
4-2. ^と$を使って完全一致にする
完全一致をしたい場合は、^ と $ を使います。
C#Regex.IsMatch("12345", @"^\d+$") // True
Regex.IsMatch("abc123", @"^\d+$") // False
^ は文字列の先頭、$ は文字列の末尾を表します。
この2つを組み合わせることで、文字列全体を条件にできます。
4-3. 想定外にtrueになる原因
Regex.IsMatch が想定外に true になる原因の多くは、部分一致によるものです。
たとえば、英数字だけの判定をしたいのに、[a-zA-Z0-9]+ だけを書いていると、文字列の一部が一致して true になります。
C#Regex.IsMatch("abc-", @"[a-zA-Z0-9]+") // True
abc の部分が一致しているためです。
全体をチェックしたいなら、必ず ^...$ で囲みます。
4-4. 入力値検証では完全一致を使うべきケース
フォームの入力チェックでは、ほとんどの場合、完全一致を使うべきです。
たとえば、郵便番号やユーザーID、社員番号、日付形式などは、文字列全体が条件を満たしている必要があります。
そのため、入力値検証では次の考え方が基本です。
「含まれているか」を確認したいなら部分一致。
「形式そのものが正しいか」を確認したいなら完全一致。
4-5. StartsWith・EndsWith相当の判定方法
Regex.IsMatch でも、先頭一致や末尾一致のような判定ができます。
ただし、単純な文字列判定で足りるなら StartsWith や EndsWith のほうが分かりやすいです。
先頭が abc で始まるかを確認するなら、次のように書けます。
C#Regex.IsMatch(input, @"^abc")
末尾が .txt で終わるかを確認するなら、次のようにします。
C#Regex.IsMatch(input, @"\.txt$")
単純な用途なら、正規表現よりも専用メソッドを優先したほうが保守しやすくなります。
5. Regex.IsMatchが一致しない原因と対処法
Regex.IsMatch がうまく一致しない場合、原因はほぼパターンか入力データにあります。
代表的なつまずきポイントを順番に見ていきましょう。
5-1. パターンのエスケープ不足
正規表現では、. や +、*、? などが特殊文字として扱われます。
そのため、文字としてそのまま使いたい場合はエスケープが必要です。
たとえば、. は「任意の1文字」を意味します。
ドットそのものを表したいなら \. と書きます。
C#Regex.IsMatch("example.com", @"example\.com") // True
5-2. バックスラッシュの書き方ミス
C#ではバックスラッシュの扱いに注意が必要です。
通常文字列と逐語的文字列で書き方が変わります。
通常文字列では次のように書きます。
C#Regex.IsMatch(input, "^\\d+$")
逐語的文字列では次のように書けます。
C#Regex.IsMatch(input, @"^\d+$")
@"..." を使うほうが、正規表現との相性はよいです。
書き間違いを減らしたいなら、逐語的文字列を基本にするとよいでしょう。
5-3. 大文字・小文字の違い
正規表現は、何も指定しないと大文字・小文字を区別します。
そのため、abc と ABC は別の文字列として扱われます。
C#Regex.IsMatch("ABC", @"abc") // False
大文字小文字を無視したい場合は、RegexOptions.IgnoreCase を使います。
これについては後の章で詳しく説明します。
5-4. 全角・半角の違い
見た目が似ていても、全角と半角は別の文字です。
たとえば、123 と 123 は同じように見えても別扱いになります。
日本語入力では、全角スペースや全角記号が混ざることもよくあります。
判定が一致しないときは、まず入力データに全角文字が含まれていないか確認しましょう。
5-5. 改行が含まれている
テキストエリアやログデータでは、改行が含まれていることがあります。^ や $ の挙動にも影響するため、想定外の不一致が起こります。
たとえば、改行を含む文字列に対して単純なパターンを当てると、期待通りにならないことがあります。
改行が入る可能性があるなら、入力を事前に整形するか、RegexOptions.Singleline などを検討します。
5-6. 空白やタブが混ざっている
前後に空白があるだけで一致しないケースは非常に多いです。
入力フォームやCSVデータでは、末尾にスペースが混入していることがあります。
C#input = input.Trim();
必要に応じて、正規表現の前に Trim を挟むとよいでしょう。
「空白を許可するか」「無視するか」を仕様として決めておくことが大切です。
5-7. ^と$の指定位置が間違っている
^ と $ は強力ですが、位置を間違えると意図した判定になりません。
たとえば、^[a-z]+$ では完全一致ですが、^[a-z]+ だけだと末尾まで縛れません。
また、括弧の外と中でも意味が変わるため、複雑なパターンほど注意が必要です。
完全一致にしたいときは、最初に ^、最後に $ を置く、と覚えておくと安心です。
5-8. nullや空文字を渡している
null を渡した場合、Regex.IsMatch は例外になることがあります。
空文字 "" は例外にはならなくても、結果が期待と違うことがあります。
入力値を扱う前に、まず次のようなチェックを入れるのが安全です。
C#if (string.IsNullOrWhiteSpace(input))
{
return false;
}
正規表現の前に基本的な入力チェックを行うことで、不要な例外や誤判定を減らせます。
6. RegexOptionsを使った実践的な判定
RegexOptions を使うと、判定の挙動を細かく調整できます。
実務では、オプションの有無で使い勝手が大きく変わります。
6-1. IgnoreCaseで大文字・小文字を無視する
大文字小文字を無視したい場合は、RegexOptions.IgnoreCase を使います。
C#Regex.IsMatch("ABC", @"abc", RegexOptions.IgnoreCase) // True
メールアドレスのドメイン部分や、固定キーワードの判定で便利です。
ただし、厳密な大小文字区別が必要な場面では使わないようにします。
6-2. Multilineで複数行を判定する
RegexOptions.Multiline を使うと、^ と $ が文字列全体ではなく、各行の先頭と末尾に対しても機能します。
C#Regex.IsMatch("first\nsecond", @"^second$", RegexOptions.Multiline)
複数行テキストの中から行単位で判定したいときに役立ちます。
ログやテキストファイルの処理で使うことが多いです。
6-3. Singlelineで改行を含めて判定する
RegexOptions.Singleline を使うと、. が改行にも一致するようになります。
通常の正規表現では . は改行を除く任意の1文字です。
たとえば、次のような判定で役立ちます。
C#Regex.IsMatch(input, @"^.*$", RegexOptions.Singleline)
改行を含む長い文字列を一括で扱いたいときに便利です。
ただし、乱用すると意図が分かりにくくなるため、必要な場面だけで使いましょう。
6-4. Compiledでパフォーマンスを意識する
同じ正規表現を何度も使う場合は、RegexOptions.Compiled を検討できます。
これは正規表現をコンパイルして、繰り返し使用時の性能向上を狙うオプションです。
C#var regex = new Regex(@"^\d+$", RegexOptions.Compiled);
ただし、コンパイルにもコストがあります。
使う回数が少ないなら、必ずしも有利とは限りません。
「繰り返し大量に評価する」場面で検討するのが現実的です。
6-5. CultureInvariantを使うべきケース
RegexOptions.CultureInvariant は、現在のカルチャに影響されにくい判定をしたいときに使います。
文字の比較を環境依存にしたくない場合に有効です。
グローバル対応のアプリや、動作環境による差異を減らしたい処理で検討されます。
カルチャ依存の挙動が問題になる場面では、意識しておく価値があります。
6-6. 複数のRegexOptionsを組み合わせる方法
RegexOptions はビット演算子で組み合わせられます。
C#var options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
bool result = Regex.IsMatch(input, pattern, options);
複数の条件を同時に指定したいときに便利です。
たとえば、行単位で大文字小文字を無視して判定したい場合などに使えます。
7. Regex.IsMatchの実用例
ここからは、Regex.IsMatch の実際の使いどころを見ていきます。
単なる形式チェックだけでなく、業務ロジックでも広く活用できます。
7-1. フォーム入力値のバリデーション
ユーザー入力のチェックは、Regex.IsMatch の代表的な用途です。
C#bool isZipCode = Regex.IsMatch(input, @"^\d{3}-\d{4}$");
郵便番号、電話番号、社員番号、会員番号など、形式が決まっている入力に向いています。
入力の早い段階でエラーを返せるため、ユーザー体験の向上にもつながります。
7-2. パスワードの強度チェック
パスワードの条件確認にも利用できます。
たとえば、英字と数字の両方を含むかを確認する場合は、複数の判定を組み合わせます。
C#bool hasLower = Regex.IsMatch(password, @"[a-z]");
bool hasUpper = Regex.IsMatch(password, @"[A-Z]");
bool hasDigit = Regex.IsMatch(password, @"\d");
1つの巨大な正規表現にまとめることもできますが、可読性を考えると複数回に分けたほうが分かりやすい場合もあります。
保守しやすさを優先しましょう。
7-3. ファイル名・拡張子の判定
ファイル名の末尾が特定拡張子かどうかを調べる場合にも使えます。
C#bool isTextFile = Regex.IsMatch(fileName, @"\.txt$", RegexOptions.IgnoreCase);
ただし、単純な拡張子判定なら Path.GetExtension のほうが明快なこともあります。
正規表現を使う理由があるかどうかを一度考えると、無駄な複雑化を防げます。
7-4. 文字列に特定の単語が含まれるか判定
キーワードが含まれているかどうかを判定したいときは、Regex.IsMatch がそのまま使えます。
C#bool containsWord = Regex.IsMatch(text, @"\berror\b", RegexOptions.IgnoreCase);
単純な Contains("error") だと、terror のような別単語にも反応します。
単語境界 \b を使うことで、必要な単語だけを拾いやすくなります。
7-5. 禁止文字が含まれるか判定
入力に禁止文字が含まれていないかをチェックするのもよくある用途です。
C#bool hasInvalidChars = Regex.IsMatch(input, @"[<>:""/\\|?*]");
ファイル名やIDの入力などで、使用禁止文字を検出する際に使えます。
一致したらエラーにする、という流れにしやすいのが利点です。
7-6. CSVやログの行形式を判定
CSVやログファイルの各行が決まった形式かどうかを判定する用途にも使えます。
C#bool isLogLine = Regex.IsMatch(line, @"^\[\d{4}-\d{2}-\d{2} .+\] .+$");
厳密なパース処理ではなく、「おおよその形式を確認したい」ときに便利です。
ただし、複雑な構造を正規表現だけで完全に扱うのは難しいため、必要に応じて専用のパーサーを使うほうが安全です。
7-7. ASP.NETやBlazorで入力チェックに使う例
Webアプリケーションでは、Regex.IsMatch をフォーム入力の検証に使う場面が多くあります。
ASP.NETやBlazorでも、入力値のバリデーションに応用可能です。
たとえば、郵便番号チェックやユーザー名チェックを、サーバー側で行うと信頼性が高まります。
クライアント側のチェックだけに頼らず、サーバー側でも同じルールを適用するのが基本です。
8. Regex.IsMatchを使うときの注意点
便利な Regex.IsMatch ですが、使い方を誤ると可読性や保守性が下がります。
実務で気をつけたいポイントを整理します。
8-1. 複雑すぎる正規表現は可読性が下がる
正規表現は強力ですが、長くなりすぎると読みにくくなります。
一見すると1行で済むように見えても、後から修正しにくいコードは保守コストが高くなります。
「本当に正規表現で書く必要があるか」を考え、単純な条件は通常の文字列処理に置き換えることも大切です。
8-2. ユーザー入力を扱う場合のタイムアウト対策
ユーザー入力をそのまま正規表現にかける場合は、タイムアウト対策を考慮しましょう。
複雑なパターンは、悪意ある入力で極端に遅くなる可能性があります。
Regex にはタイムアウトを指定できるオーバーロードがあります。
外部入力を扱うシステムでは、安全側に寄せる設計が重要です。
8-3. 何度も使うパターンはRegexインスタンス化を検討する
同じパターンを大量に使うなら、毎回 Regex.IsMatch を呼ぶよりも、Regex インスタンスを再利用するほうが扱いやすいことがあります。
特に、パターンが固定で繰り返し利用される場面では有効です。
C#private static readonly Regex NumberRegex = new Regex(@"^\d+$");
このように定義しておけば、コード全体の見通しも良くなります。
8-4. 入力チェックに正規表現だけを使いすぎない
正規表現は万能ではありません。
入力チェックでは、まず基本的な null や空白の確認を行い、その後に正規表現を使うほうが自然です。
また、日付や数値の妥当性確認は、正規表現よりも型変換や専用APIのほうが適している場合があります。
目的に応じて使い分けることが大切です。
8-5. パターンを定数化して保守しやすくする
正規表現パターンをコード内に直書きすると、修正箇所が散らかりやすくなります。
再利用するパターンは定数や共通クラスにまとめましょう。
C#private const string ZipCodePattern = @"^\d{3}-\d{4}$";
こうしておくと、変更が必要になったときに一箇所だけ直せます。
チーム開発では特に重要です。
9. Regex.IsMatchのエラーと例外への対処
Regex.IsMatch は便利ですが、入力やパターンの問題で例外が発生することがあります。
代表的な例外と対策を確認しておきましょう。
9-1. ArgumentNullExceptionが発生するケース
input や pattern に null を渡すと、ArgumentNullException が発生することがあります。
事前に null チェックを入れることで防げます。
C#if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(pattern))
{
return false;
}
9-2. ArgumentExceptionが発生する正規表現パターン
正規表現の書き方が不正だと、ArgumentException が発生します。
たとえば、括弧の閉じ忘れや不正なエスケープなどです。
C#Regex.IsMatch("abc", @"(") // 例外
パターンは、実装時に1度は確認しておくと安心です。
複雑な式は小さく分けてテストすると、原因特定がしやすくなります。
9-3. RegexMatchTimeoutExceptionへの対処
タイムアウトを設定している場合、判定に時間がかかりすぎると RegexMatchTimeoutException が発生します。
これは異常な入力や複雑すぎるパターンを検知するための安全装置です。
対処としては、次のような方法があります。
パターンを簡単にする。
入力サイズを制限する。
タイムアウト値を見直す。
必要なら正規表現以外の方法に切り替える。
9-4. try-catchで安全に判定する方法
例外が起こる可能性があるなら、try-catch で囲むこともできます。
C#try
{
bool result = Regex.IsMatch(input, pattern);
}
catch (ArgumentException)
{
// 不正なパターン
}
catch (RegexMatchTimeoutException)
{
// タイムアウト
}
ただし、例外は「通常の分岐」に使いすぎないことが大切です。
予防できる問題は、事前チェックで防ぐほうが自然です。
9-5. デバッグしやすい正規表現の確認方法
正規表現のデバッグでは、いきなり複雑な式を作るより、小さく試すほうが成功しやすいです。
部分ごとに一致を確認し、少しずつ条件を足していくと、どこで崩れたかが分かります。
また、テストケースを複数用意して、true になるべき文字列と false になるべき文字列を整理しておくと、修正時にも安心です。
10. Regex.IsMatchに関するよくある質問
10-1. Regex.IsMatchで完全一致させるには?
^ と $ を使います。
C#Regex.IsMatch(input, @"^\d+$")
これで、文字列全体が数字のときだけ true になります。
10-2. Regex.IsMatchがtrueになるのはなぜ?
Regex.IsMatch は部分一致だからです。
文字列の一部でもパターンに合えば true を返します。
完全一致させたいなら、^...$ で囲んでください。
10-3. Regex.IsMatchで大文字小文字を無視するには?
RegexOptions.IgnoreCase を使います。
C#Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase)
10-4. Regex.IsMatchとRegex.Matchの違いは?
Regex.IsMatch は一致するかどうかの判定だけを返します。Regex.Match は一致した内容や位置の情報を返します。
判定だけなら IsMatch、一致箇所の詳細が必要なら Match を使います。
10-5. Regex.IsMatchは日本語の判定にも使える?
使えます。
たとえば、日本語の文字種を判定したり、ひらがな・カタカナ・漢字の混在を確認したりできます。
ただし、文字種の判定は要件によって書き方が変わるため、どの範囲を日本語とするかを先に決めることが重要です。
10-6. 正規表現パターンはどこまで厳密に書くべき?
厳密すぎると保守が難しくなり、緩すぎると誤判定が増えます。
実務では「業務上必要な範囲で十分に正しい」レベルが最適です。
たとえば、メールアドレスやURLは完全厳密化が難しいため、一般的な形式チェックにとどめることも多いです。
逆に、郵便番号や社員番号のような形式が固定されたものは、厳密に書きやすいです。
まとめ
C#の Regex.IsMatch は、文字列が正規表現に一致するかを手軽に判定できる便利なメソッドです。
ただし、基本は部分一致であること、完全一致には ^ と $ が必要なこと、エスケープや RegexOptions の扱いが重要なことを理解しておく必要があります。
数字・英字・メールアドレス・電話番号・郵便番号・URLなど、実務で使う判定はかなり幅広く対応できます。
一方で、正規表現が複雑になりすぎると可読性や保守性が下がるため、必要に応じて通常の文字列処理や専用APIと使い分けることが大切です。
c# regex.ismatch を正しく使いこなせば、入力チェックや形式判定のコードを短く、分かりやすく、保守しやすく書けます。

