正規表現

正規表現に関連するクラス
クラス 用途
Regex 変更不可の正規表現
RegexCompilationInfo 正規表現をコンパイルしてアセンブリを作成するために使用する、正規表現についての情報
RegexRunner コンパイル済みの正規表現の基本クラス
(製品インフラストラクチャをサポートしており、コードから直接使用されることを想定していない)
RegexRunnerFactory コンパイルされた正規表現用の、RegexRunnerクラスを作成する
(製品インフラストラクチャをサポートしており、コードから直接使用されることを想定していない)
RegexMatchTimeoutException 正規表現パターン一致メソッドの実行時間が、そのタイムアウト間隔を超えるとスローされる例外
検索結果を表すクラス
クラス 用途
Match 単一の正規表現検索の結果
Group 単一のキャプチャ グループの結果
Capture 単一の部分式キャプチャの結果
MatchCollection 正規表現パターンを入力文字列に繰り返し適用したときにパターンに一致した、一連の対象
GroupCollection 1回の検索一致でキャプチャされた、グループのセット
CaptureCollection 1つのキャプチャ グループによって作成された、キャプチャのセット
System.Text.RegularExpressions 名前空間 | MSDN

Regexクラス

string text = "ab123cd99";
Regex regex = new Regex("[0-9]+");

Match match = regex.Match(text);
// match.value "123"

MatchCollection matches = regex.Matches(text);
// matches[0].Value "123"
// matches[1].Value "99"

string str = regex.Replace(text, "A");
// str "abAcdA"

if(regex.IsMatch(text))
{
    //
}

コンストラクタ

正規表現のパターンを指定し、インスタンスを生成します。コンストラクター - Regex クラス (System.Text.RegularExpressions) | MSDN

public Regex(
    string pattern,       // 正規表現パターン
    RegexOptions options, // 正規表現オプション
    TimeSpan matchTimeout // タイムアウト時間
)
Regex コンストラクター (String, RegexOptions, TimeSpan) (System.Text.RegularExpressions) | MSDN

無効なpatternを指定すると、ArgumentExceptionが投げられます。optionsを省略するとRegexOptions.Noneが、matchTimeoutを省略するとタイムアウトしません。

patternの内容を予測できない場合は、タイムアウトを指定するのが安全です。タイムアウト値を使用する - .NET の正規表現に関するベスト プラクティス | Microsoft Learn

string input = "AAAAAAAAAAaaaaaaaaaa!";
string pattern = @"^[0-9A-Z]([-.\w]*[0-9A-Z])*$";

Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(10));
// RegexMatchTimeoutException「パターンと入力文字列との照合中に、RegEx エンジンがタイムアウトしました。これは、非常に大きな入力、入れ子になった量指定子によって生じた過剰なバックトラッキング、前方参照などの要因を含む、さまざまな原因によって発生する可能性があります。」
RegexOptions 列挙型
列挙子 意味
None オプションなし

ECMAScript、RightToLeft、IgnoreCase、IgnorePatternWhitespace、CultureInvariant、ExplicitCaptureを指定しないのと同じ 既定のオプション - 正規表現のオプション | Microsoft Learn

Compiled アセンブリにコンパイルすることを指示。起動は遅くなるが、実行は早くなる コンパイルされた正規表現 - 正規表現のオプション | Microsoft Learn .net - How does RegexOptions.Compiled work? - Stack Overflow
ECMAScript ECMAScriptに準拠した動作とする ECMAScript 一致の動作 - 正規表現のオプション | Microsoft Learn
RightToLeft 右から左に検索
IgnoreCase 検索時に、大文字/小文字を区別しない
IgnorePatternWhitespace エスケープされていない空白を、パターンから除外する
CultureInvariant 言語の文化的な違いを無視することを指示
ExplicitCapture 名前のないグループをキャプチャしない
Multiline 複数行モード
Singleline 単一行モード
RegexOptions 列挙型 (System.Text.RegularExpressions) | Microsoft Learn

正規表現パターン

エスケープ

Character Escapes in .NET Regular Expressions | Microsoft Learn

リテラルが正規表現のメタ文字として解釈されないようにするには、Regex.Escape()でエスケープできます。

public static string Escape (string str);
Regex.Escape(String) メソッド (System.Text.RegularExpressions) | Microsoft Learn
string str = Regex.Escape("\\,*,+,?,|,{,[,(,),^,$,.,#, ");
// "\\,\*,\+,\?,\|,\{,\[,\(,\),\^,\$,\.,\#,\ "

メソッド

メソッド 機能
IsMatch(String) 正規表現に一致するかどうか判定できる
Match(String) 正規表現に一致する、最初の1つを取得できる
Matches(String) 正規表現に一致する、すべての文字列を取得できる
Replace(String, String) 正規表現に一致するすべての文字列を、置換文字列に置換できる
   
メソッド - Regex クラス (System.Text.RegularExpressions) | Microsoft Learn

Match()

public Match Match(
    string input
)
Regex.Match メソッド (String) (System.Text.RegularExpressions) | MSDN

検索結果は戻り値のMatchオブジェクトで確認できます。それのSuccessプロパティがtrueならば一致しており、falseならば不一致です。一致した結果は、その部分文字列のValueプロパティで取得できます。取得できるのは最初の一致のみで、すべてを取得するにはMatches()を用います。

Matches()

public MatchCollection Matches(
    string input
)
Regex.Matches メソッド (String) (System.Text.RegularExpressions) | MSDN

Replace()

public string Replace(
    string input,      // 一致する対象を検索する文字列
    string replacement // 置換文字列
)
Regex.Replace メソッド (String, String) (System.Text.RegularExpressions) | MSDN

パターンに一致した場合は置換された文字列を、さもなくば置換前の元の文字列が返されます。

string text = "abc123def";
Regex regex = new Regex("[0-9]+");

string r1 = regex.Replace(text, "X"); // "abcXdef"
string r2 = Regex.Replace("abc", "(a)(b)(c)", "$3$2$1"); // "cba"

静的メソッド

くり返し使用しないパターンならば、静的メソッドから呼び出す方法もあります。

Match match             = Regex.Match(text, "[0-9]+");
MatchCollection matches = Regex.Matches(text, "[0-9]+");
string str              = Regex.Replace(text, "[0-9]+", "A");

なおこれらは、次のように生成したオブジェクトからメソッドを呼び出すことと同じ結果を得られます。

Match match             = new Regex("[0-9]+").Match(text);
MatchCollection matches = new Regex("[0-9]+").Matches(text);
string str              = new Regex("[0-9]+").Replace(text, "A");

実行方法

方法 手順 特徴
静的正規表現 (static regular expressions) インスタンス化せず、Regexクラスの静的メソッドを呼び出す 使用したパターンは内部にキャッシュされる。その数は既定で15だが、Regex.CacheSizeで変更できる。

.NET Framework 2.0 SP1以降では、静的メソッドの呼び出しのみがキャッシュされる

解釈される正規表現 (interpreted regular expressions) Regexオブジェクトをインスタンス化し、解釈される正規表現のインスタンス メソッドを呼び出す 始動時間は短いが、実行時間が長い。メソッドの呼び出し回数が少ない場合に有効
コンパイルされる正規表現 (compiled regular expressions) Regexオブジェクトをインスタンス化し、コンパイルされた正規表現のインスタンス メソッドを呼び出す 始動時間は長いが、実行時間が短い。メソッドの呼び出し回数が多い場合に有効
アセンブリにコンパイルされる正規表現 (compiled to an assembly regular expressions) 特定の正規表現パターンのRegexオブジェクトを作成し、コンパイルして、アセンブリに保存する。そして実行時にそれを読み込み、そのメソッドを呼び出す メソッドの呼び出し回数を特定できない場合に有効

解釈またはコンパイルされる正規表現のいずれが効率的かは、正規表現の複雑さや処理対象によって異なるため、実際に実行時間を計測して検討します。

Matchクラス

プロパティ

Match クラス (System.Text.RegularExpressions) | Microsoft Learn

Groups

一致したグループのコレクション (GroupCollection) を取得できます。

Groupクラス

個々のグループを表します。

必要なときのみグループをキャプチャするようにします。キャプチャはグループ化を(?:subexpression)としたり、ExplicitCaptureオプションを指定することで無効にできます。必要なときにのみキャプチャする - .NET の正規表現に関するベスト プラクティス | Microsoft Learn

string text = "ab_12 cd_34";
Regex regex = new Regex("([a-z]+)_([0-9]+)");

Match match = regex.Match(text);
// match.Value           "ab_12"
// match.Groups.Count    3
// match.Groups[0].Value "ab_12"
// match.Groups[1].Value "ab"
// match.Groups[2].Value "12"

MatchCollection matches = regex.Matches(text);
// matches[0].Groups[1].Value "ab"
// matches[1].Groups[1].Value "cd"

正規表現でのグループ化構成体 | MSDN

RegexMatchTimeoutExceptionクラス

RegexMatchTimeoutException クラス (System.Text.RegularExpressions) | Microsoft Learn
Microsoft Learnから検索