C# の正規表現


 
正規表現は、入力テキストと一致するパターンです。正規表現を使用すると、指定されたテキストとパターンの一致を解析して検証できます。パターンには、演算子、文字リテラル、または構造体を含めることができます。

 

正規表現の構成

正規表現を使用して、指定された文字列が指定されたパターンに一致するかどうかを確認できます。正規表現の一致パターンは、数字、単語、演算子、文字などを含む一連の文字で構成されます。これらのパターンを使用して文字列またはファイルを検索し、一致するものが見つかるかどうかを確認できます。

開発では通常、メールアドレスや携帯電話番号など、ユーザーが入力した情報が正しいかどうかを検証するために正規表現を使用します。以下に、正規表現の定義に使用される文字、演算子、構成体のさまざまなクラスをリストします。

  • エスケープ文字。
  • 文字クラス。
  • ロケータ;
  • グループ構築。
  • 修飾子;
  • 後方参照構造。
  • スペア構成。
  • 交換;
  • その他の構成要素。

1) エスケープ文字

正規表現内のバックスラッシュ\その後に続く文字が特別な意味を持つ特殊文字であることを示すために使用されます。次の表に、一般的に使用されるエスケープ文字をいくつか示します。

エスケープ文字 説明 正規表現
\a アラーム (ベル) 文字と一致します \u0007 \a 「警告!」+「\u0007」の「\u0007」と一致します。
\b 文字クラスでは、バックスペース キーに一致します \u0008 [\b]{3,} 「\b\b\b\b」内の「\b\b\b\b」と一致します
\t タブ文字と一致します \u0009 (\w+)\t 「Name\tAddr\t」の「Name\t」と「Addr\t」を一致させます。
\r 復帰文字 \u000D と一致します (\r は改行文字 \n と同等ではありません) \r\n(\w+) 「\r\nHello\nWorld」の「\r\nHello」と一致します。
\v 垂直タブ文字と一致します \u000B [\v]{2,} 「\v\v\v」内の「\v\v\v」と一致します
\f フォーム フィード文字 \u000C と一致します [\f]{2,} 「\f\f\f」内の「\f\f\f」と一致します
\n 改行文字 \u000A と一致します \r\n(\w+) 「\r\nHello\nWorld」の「\r\nHello」と一致します。
\e エスケープ文字 \u001B と一致します \e 「\x001B」内の「\x001B」と一致
\nnn 8 進数形式で文字を指定します (nnn は 2 桁または 3 桁で構成されます)。 \w\040\w 「a bc d」の「ab」と「cd」に一致します
\xnn 文字は16進数で指定します(nnは2桁) \w\x20\w 「a bc d」の「ab」と「cd」に一致します
\cX\cx X または x で指定された ASCII 文字と一致します。X または x は制御文字の文字です。 \cC 「Ctrl」の「C」と一致します
\unnnn 16 進表記を使用して Unicode 文字と一致します (nnnn は 4 桁の数字を表します)。 \w\u0020\w 「a bc d」の「ab」と「cd」に一致します
\ 認識できないエスケープ文字が後に続く場合、その文字と一致します \d+[\+-x\*]\d+\d+[\+-x\*\d+ 「(2+2) * 3*9」の「2+2」および「3*9」と一致します。

2) 文字クラス

文字クラスは文字列内の任意の文字と一致します。一般的に使用される文字クラスの一部を次の表に示します。

文字クラス 説明 正規表現
[character_group] Character_group 内の任意の文字と一致します。デフォルトでは、character_group 内の文字は大文字と小文字が区別されます。 [mn] 「mat」の「m」、「moon」の「m」および「n」に一致します
[^character_group] Character_group にない任意の 1 文字と一致します。character_group 内の文字はデフォルトで大文字と小文字が区別されます。 [^aei] 「avail」の「v」と「l」に一致します
[first-class] 文字範囲。最初から最後までの任意の 1 文字と一致します。 [b-d] [bd]irds は Bird、Cirds、Dird と一致します
. ワイルドカード: 任意の文字に一致します。ピリオド (. または \u002E) に一致させたい場合は、文字の前にエスケープ文字 (\.) を追加する必要があります。 a.e 「have」の「ave」、「mate」の「ate」に一致します
\p{name} name で指定された Unicode 文字と一致します \p{Lu} 「City Lights」の「C」と「L」に一致します
\P{name} 名前に指定されていない Unicode 文字と一致します \P{Lu} 「City」の「i」、「t」、「y」と一致します
\w 文字、数字、アンダースコアの一致 \w 「Room#1」の「R」、「o」、「m」、および「1」に一致します
\W 文字、数字、アンダースコア以外の文字と一致します \W 「Room#1」の「#」と一致します
\s 任意の空白文字 (改行を含む) に一致します \w\s 「ID A1.3」の「D」と一致します
\S 空白以外の任意の文字 (改行を含む) に一致します \s\S 「int __ctr」の「_」と一致します
\d 任意の 10 進数に一致します \d 「4 = IV」の「4」と一致します
\D 10 進数ではない任意の文字に一致します \D 「4 = IV」の「」、「=」、「」、「I」、および「V」に一致します

3) ロケーター

ロケーターは、文字列が出現する特定の位置に応じて、一致が成功したか失敗したかを判断できます。一般的に使用されるロケーターを次の表に示します。

アサーション 説明 正規表現
^ 文字列の先頭から一致 ^\d{3} 「567-777-」の「567」と一致
$ 文字列の末尾から一致 -\d{4}$ 「8-12-2012」の「-2012」と一致します
\A 一致文字列の開始 \A\w{4} 「Code-007-」の「Code」と一致
\Z 文字列の末尾、または文字列末尾の改行の前の位置と一致します。 -\d{3}\Z 「Bond-901-007」の「-007」と一致します
\z 文字列の末尾と一致する -\d{3}\z 「-901-333」の「-333」と一致
\G 前の試合が終了した試合 \G\(\d\) 「(1)(3)(5)[7](9)」の「(1)」、「(3)」、「(5)」と一致します。
\b 単語の開始位置または終了位置と一致します er\b 「never」の「er」には一致しますが、「動詞」の「er」には一致しません。
\B 単語の途中に一致します er\B 「動詞」の「er」には一致しますが、「never」の「er」には一致しません。

4) グループ構成

グループ化構造は正規表現の部分式を記述し、入力文字列の部分文字列をキャプチャします。次の表に、一般的に使用されるグループ化構造を示します。

グループ構造 説明 正規表現
(subexpression) 一致する部分式を取得し、それをゼロから始まる序数に割り当てます。 (\w)\1 deepのee
(?<name>subexpression) 一致した部分式を名前付きグループにキャプチャします (?<ダブル>\w)\k<ダブル> deepのee
(?<name1 -name2>subexpression) バランスグループの定義 (((?’開く’\()[^\(\)]*)+((?’閉じる-開く’\))[^\(\)]*)+)*(?(開く)(? !))$ 「3+2^((1-3)*(3-1))」の「((1-3)*(3-1))」
(?:subexpression) 非キャプチャグループを定義する Write(?:Line)? 「Console.WriteLine()」の「WriteLine」
(?imnsx-imnsx:subexpression) 部分式で指定されたオプションを適用または無効にします A\d{2}(?i:\w+)\b 「A12xl A12XL a12xl」の「A12xl」と「A12XL」
(?= subexpression) ゼロ幅の正の先読みアサーション \w+(?=\.) 「He is. The dog ran. The sun is out.」の「is」、「ran」、「out」。
(?! subexpression) ゼロ幅の否定先読みアサーション \b(?!un)\w+\b 「unsure sure unity used」の「sure」
(?<=subexpression) ゼロ幅ポジティブルックバック後のアサート (?<=19)\d{2}\b 「1851 1999 1950 1905 2003」の「99」、「50」、「05」
(? ゼロ幅のネガティブ ルックバック後のアサート (? 「Hi woman Hi man」の「man」
(?> subexpression) 非バックトラック (別名「貪欲」) 部分式 [13579](?>A+B+) 「1ABB 3ABBC 5AB 5AC」の「1ABB」「3ABB」「5AB」

5) 予選

修飾子は、正常に一致するために文字列内に要素 (文字、グループ、または文字クラス) が存在する必要があることを指定するために使用されます。次の表に、一般的に使用される修飾子のリストを示します。

修飾子 説明 正規表現
* 前の要素と 0 回以上一致します \d*\.\d 「.0」、「19.9」、「219.9」
+ 前の要素と 1 回以上一致します 「be+」 「been」の「bee」、「bent」の「be」に一致します
? 前の要素と 0 回または 1 回一致します “雨” 「走る」、「雨」
{n} 前の要素と n 回一致します “,\d{3}” 「1,043.6」の「,043」、「9,876,543,210」の「,876」、「,543」、および「,210」と一致します。
{n,} 前の要素と少なくとも n 回一致します 「\d{2,}」 「166」、「29」、「1930」
{n、m} 前の要素と少なくとも n 回、最大 m 回一致します。 「\d{3,5}」 「166」、「17668」、「193024」の「19302」と一致
*? 前の要素と 0 回以上一致しますが、できるだけ少ない回数で一致します \d*?\.\d 「.0」、「19.9」、「219.9」
+? 前の要素と 1 回以上一致しますが、できるだけ少ない回数で一致します。 「be+?」 「been」の「be」、「bent」の「be」に一致します
?? 前の要素と 0 回または 1 回一致しますが、できるだけ少ない回数で一致します “雨” 「走る」、「雨」
{n}? 先頭の要素と正確に n 回一致します 「,\d{3}?」 「1,043.6」の「,043」、「9,876,543,210」の「,876」、「,543」、および「,210」と一致します。
{ん、}? 前の要素と少なくとも n 回一致しますが、できるだけ少ない回数で一致します 「\d{2,}?」 「166」「29」「1930」
{ん、ん}? 前の要素と n 回から m 回一致しますが、できるだけ少ない回数で一致します。 「\d{3,5}?」 「166」、「17668」、「193024」の「193」と「024」に一致します

6) 後方参照の構築

後方参照構造を使用すると、以前に一致した部分式を同じ正規表現内で後で識別できるようになります。次の表に、一般的に使用される後方参照構造を示します。

後方参照構造 説明 正規表現
\番号 後方参照、番号付き部分式の値と一致する (\w)\1 「seek」の「ee」と一致します
\k<名前> 名前付き後方参照。名前付き式の値と一致します。 (?< 文字>\w)\k< 文字> 「seek」の「ee」と一致します

7) 代替構造

代替構成を使用して正規表現を変更し、どちらかまたは両方の一致を有効にします。次の表に、一般的に使用される代替構成を示します。

代替構成 説明 正規表現
| 垂直バー|文字で区切られた任意の 1 つの要素と一致します th(e|is|at) 「this is the day」の「the」と「this」に一致します。
(?( espression )yes|no 正規表現パターンが式マッチングで指定されている場合は、yes 部分が一致します。それ以外の場合は、オプションの no 部分が一致し、式はゼロ幅アサーションとして解釈されます。 (?(A)A\d{2}\b|\b\d{3}\b) 「A10 C103 910」の「A10」および「910」と一致します
(?(name)yes|no) 名前または名前付きまたは番号付きキャプチャ グループが一致する場合は、yes 部分と一致し、そうでない場合は、オプションの no 部分と一致します。 (?<quoted>”)?(?(quoted).+?”|\S+\s) 「Dogs.jpg “Yiska playing.jpg”」内のDogs.jpgと「Yiska playing.jpg」を一致させます。

8) 交換する

replace は、置換パターンで使用される正規表現です。次の表に、置換に使用される文字を示します。

キャラクター 説明 モデル パターンを置き換える 入力文字列 結果文字列
$number グループ番号に一致する部分文字列を置換します \b(\w+)(\s)(\w+)\b $3$2$1 「one two」 「two one」
${名前} 名前付きグループ名と一致する部分文字列を置換します \b(?<単語 1>\w+)(\s)(?<単語 2>\w+)\b ${単語2} ${単語1} 「one two」 「two one」
$$ 文字「$」を置き換えます \b(\d+)\s?USD $$$1 「103 USD」 「$103」
$& 一致全体のコピーを置き換えます (\$*(\d*(\.+\d+)?){1}) **$& 「$1.30」 「**$1.30**」
$` 一致する前の入力文字列内のすべてのテキストを置換します。 B+ $` 「AABBCC」 「AAAACC」
$’ 一致後に入力文字列内のすべてのテキストを置換します B+ $’ 「AABBCC」 「AACCCC」
$+ 最後にキャプチャされたグループを置き換えます B+(C+) $+ 「AABBCCDD」 AACCDD
$_ 入力文字列全体を置き換えます B+ $_ 「AABBCC」 「AAAABBCCCC」

9) その他の構成要素

次の表に、さまざまな構成要素を示します。

構造 説明
(?imnsx-imnsx) パターンの途中で大文字と小文字を区別しないなどのオプションを設定または無効にする \bA(?i)b\w+\b は、「ABA Able Act」の「ABA」および「Able」と一致します。
(?#コメント) インラインコメント。コメントは最初の閉じ括弧で終了します \bA(?# は A で始まる単語と一致します)\w+\b
# [行末] コメントはエスケープされていない # で始まり、行の終わりまで続きます。 (?x)\bA\w+\b# は A で始まる単語と一致します

正規表現クラス

Regex クラスは正規表現を使用するために使用されます。Regex クラスで一般的に使用されるいくつかのメソッドを次の表に示します。

方法 説明
public bool IsMatch( string input ) Regex コンストラクターで指定された正規表現が、指定された入力文字列内で一致するかどうかを示します。
public bool IsMatch( string input, int startat ) Regex コンストラクターで指定された正規表現が、文字列内の指定された位置から始まる指定された入力文字列内で一致を見つけるかどうかを示します。
public static bool IsMatch( string input, string pattern ) 指定された正規表現が指定された入力文字列内で一致するかどうかを示します。
public MatchCollection Matches( string input ) 指定された入力文字列内の正規表現に一致するものをすべて検索します。
public string Replace( string input, string replacement ) 指定された入力文字列内で、正規表現パターンのすべての出現箇所を指定された置換文字列で置き換えます。
public string[] Split( string input ) 入力文字列を部分文字列の配列に分割し、Regex コンストラクターで指定された正規表現パターンで定義された位置で分割します。

[例] 「C」で始まる一致フレーズ:

 using System;
using System.Text.RegularExpressions;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            string str = "C#チュートリアル IT基礎 it-kiso.com 正規表現";
            showMatch(str, @"\bC\S*");
            Console.ReadKey();
        }
        private static void showMatch(string text, string expr)
        {
            Console.WriteLine("正規表現は: " + expr);
            Console.WriteLine("「C」で始まる文字列に一致するもの: ");
            MatchCollection mc = Regex.Matches(text, expr);
            foreach (Match m in mc)
            {
                Console.WriteLine(m);
            }
        }
    }
} 

[例] 「m」で始まり「e」で終わる単語と一致します。

 using System;
using System.Text.RegularExpressions;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            string str = "迷路を作って測定する";
            showMatch(str, @"\bm\S*e\b");
            Console.ReadKey();
        }
        private static void showMatch(string text, string expr)
        {
            Console.WriteLine("正規表現: " + expr);
            Console.WriteLine("mから始まりeで終わる単語の一致: ");
            MatchCollection mc = Regex.Matches(text, expr);
            foreach (Match m in mc)
            {
                Console.WriteLine(m);
            }
        }
    }
} 

操作の結果は次のようになります。

make
maze
manage
measure

[例] 文字列内の余分なスペースを削除します。

 using System;
using System.Text.RegularExpressions;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            string input = "C   言語   日本語ネットワーク   ";
            string pattern = "\\s+";
            Regex rgx = new Regex(pattern);
            string result = rgx.Replace(input, "");

            Console.WriteLine("元の文字列: {0}", input);
            Console.WriteLine("置換後の文字列: {0}", result);   
            Console.ReadKey();
        }
    }
} 

操作の結果は次のようになります。

原始字符串: C   语言   日本語网
替换后的字符串: IT基礎

「C# の正規表現」についてわかりやすく解説!絶対に観るべきベスト2動画

正規表現を覚えるための動画①
https://www.youtube.com/watch?v=PqXPuN_WubI&pp=ygUYQyMg44Gu5q2j6KaP6KGo54–JmhsPUpB
【正規表現】No.1 正規表現とは?【プログラミング】【VOICEROID】