DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

正規表現を使って文字列がある形式と一致するか調べる

指定された正規表現のパターンと一致する対象が入力文字列内で見つかるかどうかを調べるには、RegexクラスのIsMatchメソッドを使用します。ここではIsMatchメソッドを使った例を幾つか紹介します。

なお、正規表現のパターンと一致する個所を探し、見つかったらその箇所を抽出する方法は、「正規表現を使って文字列を検索し、抽出する」で紹介しています。

注意:ここでは正規表現の説明はしません。.NET Frameworkの正規表現の基本は、「正規表現の基本」で説明しています。
補足:「正規表現テストツール」を使って正規表現のテストを行うことができますので、お役立てください。
補足:ここで紹介している正規表現パターンでは、文字列の先頭と末尾を表す文字として、「^」と「$」の代わりに、「\A」と「\z」を使用しています。これには、調べる文字列の中に \n が入っていた時、それを期待していないにもかかわらずマッチしてしまう不具合を防止する目的があります。

郵便番号か調べる

次の例では、TextBox1に入力された文字列が郵便番号っぽいか(「"数字3文字"-"数字4文字"」形式になっているか)調べています。RegexOptions.ECMAScriptを指定しているのは、\d が半角の数字だけにマッチするようにするためです。

VB.NET
コードを隠すコードを選択
'郵便番号っぽいか調べる 
'パターンは"\d{3}-\d{4}"とも書ける 
If System.Text.RegularExpressions.Regex.IsMatch( _
    TextBox1.Text, _
    "\A\d\d\d-\d\d\d\d\z", _
    System.Text.RegularExpressions.RegexOptions.ECMAScript) Then

    Console.WriteLine("郵便番号です")
End If
C#
コードを隠すコードを選択
//郵便番号っぽいか調べる
//パターンは"\d{3}-\d{4}"とも書ける
if (System.Text.RegularExpressions.Regex.IsMatch(
    TextBox1.Text,
    @"\A\d\d\d-\d\d\d\d\z",
    System.Text.RegularExpressions.RegexOptions.ECMAScript))
{
    Console.WriteLine("郵便番号です");
}
補足:郵便番号の区切り文字で使われるハイフンですが、上記で使用している U+002D は「ハイフンマイナス」と言われる記号で、これ以外にも全角ハイフンマイナス(U+FF0D)、ハイフン(U+2010)、ソフトハイフン(U+00AD)、ノンブレーキングハイフン(U+2011)などがあります。さらにハイフンと似た記号にダッシュマイナスがありますが、ダッシュにはフィギュアダッシュ(U+2012)、enダッシュ(U+2013)、emダッシュ(U+2014)、ホリゾンタルバー(U+2015)などが、マイナスには負符号(U+2212)などがあります。もっと言えば、間違えやすい記号に長音記号(U+30FC)、半角長音記号(U+FF70)などもあります。ハイフンとダッシュ記号は「Pd(Punctuation, Dash)」というUnicodeのカテゴリに属していますので(波ダッシュや二重ハイフンも含まれています)、「\p{Pd}」というパターンにマッチします。これにマイナス記号と長音記号を加えると、「[\p{Pd}\u2212ーー]」というパターンになります。

半角カナ文字が含まれているか調べる

次の例ではTextBox1に入力された文字列内に半角カナ文字(Halfwidth CJK punctuationとHalfwidth Katakana variants)があるか調べています。上記の例では静的メソッドのIsMatchを使用しましたが、ここではインスタンスメソッドを使用しています。

VB.NET
コードを隠すコードを選択
'正規表現パターンを指定してRegexオブジェクトを作成 
Dim r As New System.Text.RegularExpressions.Regex("[\uFF61-\uFF9F]")

'半角カナ文字が含まれているか調べる 
If r.IsMatch(TextBox1.Text) Then
    Console.WriteLine("半角カナ文字が含まれています")
End If
C#
コードを隠すコードを選択
//正規表現パターンを指定してRegexオブジェクトを作成
System.Text.RegularExpressions.Regex r =
    new System.Text.RegularExpressions.Regex(
        @"[\uFF61-\uFF9F]");

//半角カナ文字が含まれているか調べる
if (r.IsMatch(TextBox1.Text))
{
    Console.WriteLine("半角カナ文字が含まれています");
}

メールアドレスか調べる

この説明は、「メールアドレスが正式な規則にあっているか検証する」に移動しました。

URLか調べる

次の例ではTextBox1に入力された文字列がURL(HTTP)っぽいか調べています。なおこの正規表現パターンは、「Perlメモ」で紹介されているものです。

VB.NET
コードを隠すコードを選択
'URLっぽいか調べる 
If System.Text.RegularExpressions.Regex.IsMatch( _
    TextBox1.Text, _
    "\As?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\z") Then

    Console.WriteLine("URLのようです")
End If
C#
コードを隠すコードを選択
//URLっぽいか調べる
if (System.Text.RegularExpressions.Regex.IsMatch(
    TextBox1.Text,
    @"\As?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\z"))
{
    Console.WriteLine("URLのようです");
}

電話番号か調べる

次の例ではTextBox1に入力された文字列が(日本国内の)電話番号っぽいかをおおざっぱに調べています。「電話番号に関するQ&A」を参考にしました。

VB.NET
コードを隠すコードを選択
'電話番号っぽいか調べる 
If System.Text.RegularExpressions.Regex.IsMatch( _
    TextBox1.Text, _
    "\A0\d{1,4}-\d{1,4}-\d{4}\z") Then

    Console.WriteLine("電話番号のようです")
End If
C#
コードを隠すコードを選択
//電話番号っぽいか調べる
if (System.Text.RegularExpressions.Regex.IsMatch(
    TextBox1.Text,
    @"\A0\d{1,4}-\d{1,4}-\d{4}\z"))
{
    Console.WriteLine("電話番号のようです");
}

Windowsのファイルパスか調べる

次の例では、TextBox1.TextがWindowsのファイルの絶対パスっぽいかをおおざっぱに調べています。「Regular Expression to Validate File Path and Extension」を参考にしました。

ここではファイル名に使用できない文字をPath.GetInvalidFileNameCharsメソッドで取得していますので、.NET Framework 2.0以降でのみ実行できます。この点については、「ファイル名に使用できない文字列が含まれていないか調べる」をご覧ください。

VB.NET
コードを隠すコードを選択
'ファイル名に使用できない文字を取得する
Dim invChars As New String(System.IO.Path.GetInvalidFileNameChars())
invChars = System.Text.RegularExpressions.Regex.Escape(invChars)
'ディレクトリを区切る文字を取得する
Dim sepChar As String = System.Text.RegularExpressions.Regex.Escape( _
    System.IO.Path.DirectorySeparatorChar.ToString())

'Windowsの絶対パスっぽいか調べる
If System.Text.RegularExpressions.Regex.IsMatch( _
    TextBox1.Text, _
    String.Format("\A(?:[a-z]:|{1})(?:{1}[\A{0}]+)+\z", invChars, sepChar), _
    System.Text.RegularExpressions.RegexOptions.IgnoreCase) Then
    Console.WriteLine("ファイルパスのようです")
End If
C#
コードを隠すコードを選択
//ファイル名に使用できない文字を取得する
string invChars = new string(System.IO.Path.GetInvalidFileNameChars());
invChars = System.Text.RegularExpressions.Regex.Escape(invChars);
//ディレクトリを区切る文字を取得する
string sepChar = System.Text.RegularExpressions.Regex.Escape(
    System.IO.Path.DirectorySeparatorChar.ToString());

//Windowsの絶対パスっぽいか調べる
if (System.Text.RegularExpressions.Regex.IsMatch(
    TextBox1.Text,
    string.Format(@"\A(?:[a-z]:|{1})(?:{1}[\A{0}]+)+\z", invChars, sepChar),
    System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
    Console.WriteLine("ファイルパスのようです");
}
  • 履歴:
  • 2013/9/16 ハイフン記号に関する補足を追加。「Windowsのファイルパスか調べる」を追加。
  • 2014/12/17 「^」と「$」を「\A」と「\z」に変更。「メールアドレスか調べる」を別のページに移動。