正規表現とは検索や置換で指定する文字列をパターン表現する方法です。プログラミング言語やテキストエディタなどで利用できます。もちろんC#でも使えるし覚えておくと非常に便利です。

与えられた文字列のなかに半角数字が3つ以上連続する部分を取り出すのであれば以下のようにします。

.は任意の1文字を表す .

.は任意の1文字を表します。また後述しますが.*+?^$|(){}[]\には特別な意味があるのでこれらを検索するときは前に\をつけます。

条件をみたす1文字にマッチ

[]があるとそのなかに含まれる任意の1文字にマッチし、[0-5]だと012345のなかの1文字にマッチします。[^]だとそのなかに含まれない任意の文字にマッチします。[]内では\]^-には特別な意味があるのでこれらの文字を検索するときはそのまえに\が必要です。

例) .jpg または .png で終わる、半角スペースを含まない文字列なら [^ ]+(\.jpg|\.png (.を検索するので\が必要)

直前の文字が指定された回数繰り返される

直前の文字が0回または1回出現することを表す ?
直前の文字が0回以上繰り返すことを表す *
直前の文字が1回以上繰り返すことを表す +

直前の文字が指定された回数(この場合は3回)繰り返すことを表す {3}
直前の文字が指定された回数以上(この場合は3回以上)繰り返すことを表す {,3}
直前の文字が指定された範囲の回数(この場合は3回以上5回以下)繰り返すことを表す {3,5}

例) $の後に3桁以上5桁以下の数字が続くのであれば、\$[0-9]{3,5} ($を検索するのであれば前に\が必要)

() で囲まれた文字列は文字列のまとまりを表す

() で囲まれた文字列は、文字列のまとまりを表します。 | と組み合わせることでさまざまな OR 検索を表現することができます。

行頭と行末

^ は、行頭を表し、$ は行末を表します。

他に以下のようなものを覚えておくと便利です。

\d 半角数字1文字([0-9]と同じ)
\D 半角数字以外の1文字
\s 空白文字 (スペース, タブ, 改行) 1文字
\S 空白文字以外の1文字
\w 半角英数字記号1文字
\W 半角英数字記号以外の1文字
\n 改行文字
\t タブ文字
\A 文字列の先頭
\Z 文字列の末尾

先読みと後読み

先読みとはある文字列の後に特定の文字列が存在するかどうかを調べる機能です。

肯定先読みは、正規表現の中で文字列を (?= と ) で囲みます。\d+(?=円) とすれば 100円 という文字列の 100 の部分にマッチしますが、100ドル や 100ユーロ などの 100 の部分にはマッチしません。肯定先読みは、後ろに指定した文字列が続くという条件を課しつつ、その部分はマッチさせないというようなことを実現できます。

また逆に(?! と ) で囲めば否定先読みになります。\d+(?!円)とすれば 100ドル や 100ユーロ などの 100 の部分にはマッチしますが、100円 という文字列の 100 の部分にはマッチしなくなります。

後読みとはある文字列の前に特定の文字列が存在するかどうかを調べる機能です。

肯定後読みをすることで、指定した文字列が前に存在しないものを除外することができます。肯定後読みは、正規表現の中で文字列を (?<= と ) で囲みます。 (?<=台風)\d+ という正規表現は、台風1号 という文字列の 1 の部分にはマッチしますが、ひかり519号 という文字列や のぞみ237号 といった文字列の半角数字の部分にはマッチしません。 また逆に(?

文字列の置換

正規表現で文字列の置換するときは以下のようにします。

半角数字4つの後に-が続き、その後に半角数字が2つ、さらに-が続き、その後に半角数字が2つ続くとき(例:今日は2023-12-07です)のとき、最初の-を年、次の-を月に置換して最後に日をつける場合。

() で囲まれた部分はグループと呼ばれ、左から順番に $1, \$, … という形で置換後の正規表現で参照することができるのです。

文字列を分割

2023年12月07日を文字列 年、月、日で分割します。

最短一致

最短一致とは、繰り返しに使われる ? + * {n,m} の後に ? を付けることで、できるだけ短い文字列にマッチするようになる機能です。

以下の文字列のなかから /* と */ とその間にある文字列を削除する処理として以下のように書いたとします。

int a = 1; /* 変数 a に 1 を代入 */ int b = 2; /* 変数 b に 2 を代入 */ return a + b; /* a と b の合計を返す */

実行結果は int a = 1;だけになります。こうなってしまうのは「*」「+」などを使った正規表現などの場合、マッチする部分が複数ある場合「最も左から、最も長く一致するものにマッチする」からです。コメントを削除するのであれば最短一致を使わなければなりません。

では、よき正規表現ライフを。