指定された正規表現のパターンと一致する対象が入力文字列内で見つかるかどうかを調べるには、RegexクラスのIsMatchメソッドを使用します。ここではIsMatchメソッドを使った例を幾つか紹介します。
なお、正規表現のパターンと一致する個所を探し、見つかったらその箇所を抽出する方法は、「正規表現を使って文字列を検索し、抽出する」で紹介しています。
注意:ここでは正規表現の説明はしません。.NET Frameworkの正規表現の基本は、「正規表現の基本」で説明しています。
補足:「正規表現テストツール」を使って正規表現のテストを行うことができますので、お役立てください。
補足:ここで紹介している正規表現パターンでは、文字列の先頭と末尾を表す文字として、「^」と「$」の代わりに、「\A」と「\z」を使用しています。これには、調べる文字列の中に \n が入っていた時、それを期待していないにもかかわらずマッチしてしまう不具合を防止する目的があります。
次の例では、TextBox1に入力された文字列が郵便番号っぽいか(「"数字3文字"-"数字4文字"」形式になっているか)調べています。RegexOptions.ECMAScriptを指定しているのは、\d が半角の数字だけにマッチするようにするためです。
'郵便番号っぽいか調べる 'パターンは"\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
//郵便番号っぽいか調べる //パターンは"\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を使用しましたが、ここではインスタンスメソッドを使用しています。
'正規表現パターンを指定してRegexオブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex("[\uFF61-\uFF9F]") '半角カナ文字が含まれているか調べる If r.IsMatch(TextBox1.Text) Then Console.WriteLine("半角カナ文字が含まれています") End If
//正規表現パターンを指定してRegexオブジェクトを作成 System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex( @"[\uFF61-\uFF9F]"); //半角カナ文字が含まれているか調べる if (r.IsMatch(TextBox1.Text)) { Console.WriteLine("半角カナ文字が含まれています"); }
この説明は、「メールアドレスが正式な規則にあっているか検証する」に移動しました。
次の例ではTextBox1に入力された文字列がURL(HTTP)っぽいか調べています。なおこの正規表現パターンは、「Perlメモ」で紹介されているものです。
'URLっぽいか調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, _ "\As?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\z") Then Console.WriteLine("URLのようです") End If
//URLっぽいか調べる if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"\As?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\z")) { Console.WriteLine("URLのようです"); }
次の例ではTextBox1に入力された文字列が(日本国内の)電話番号っぽいかをおおざっぱに調べています。「電話番号に関するQ&A」を参考にしました。
'電話番号っぽいか調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, _ "\A0\d{1,4}-\d{1,4}-\d{4}\z") Then Console.WriteLine("電話番号のようです") End If
//電話番号っぽいか調べる if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"\A0\d{1,4}-\d{1,4}-\d{4}\z")) { Console.WriteLine("電話番号のようです"); }
次の例では、TextBox1.TextがWindowsのファイルの絶対パスっぽいかをおおざっぱに調べています。「Regular Expression to Validate File Path and Extension」を参考にしました。
ここではファイル名に使用できない文字をPath.GetInvalidFileNameCharsメソッドで取得していますので、.NET Framework 2.0以降でのみ実行できます。この点については、「ファイル名に使用できない文字列が含まれていないか調べる」をご覧ください。
'ファイル名に使用できない文字を取得する 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}[^{0}]+)+\z", invChars, sepChar), _ System.Text.RegularExpressions.RegexOptions.IgnoreCase) Then Console.WriteLine("ファイルパスのようです") End If
//ファイル名に使用できない文字を取得する 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}[^{0}]+)+\z", invChars, sepChar), System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { Console.WriteLine("ファイルパスのようです"); }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。