C# チュートリアルlogin
C# チュートリアル
著者:php.cn  更新時間:2022-04-11 14:06:23

C# の正規表現



正規表現は、入力テキストと一致するパターンです。 .Net フレームワークは、このような照合を可能にする正規表現エンジンを提供します。パターンは、1 つ以上の文字、演算子、および構造体で構成されます。

正規表現を定義する

以下に、正規表現の定義に使用される文字、演算子、構造体のさまざまなカテゴリを示します。

  • キャラクターエスケープ

  • キャラクタークラス

  • アンカー

  • グループ構築

  • 修飾子

  • 後方参照構築

  • 代替工事

  • 交換

  • その他構築

文字エスケープ

正規表現内のバックスラッシュ文字 ( ) は、その後に続く文字が特殊文字であるか、文字が文字通り解釈される必要があることを示します。

次の表にエスケープ文字を示します:

[v]{2,}f[f]{2,}ne nnnw c xcC「x0003」(Ctrl-C)の「x0003」u nnnnwu0020w「a bc d」d+[+-x*]d+d+[+-x*d+"(2+2) * 3*9" in "2+2" と "3*9"

文字クラス

文字クラスは、文字セット内の任意の 1 文字と一致します。

次の表は文字クラスのリストです:

エスケープ文字 説明 パターン
a と一致し、アラーム (ベル) シンボル u0007 と一致します。文字クラスの a「警告!」 +「u0007」
bは、バックスペース キー u0008 と一致します。 [b]{3,}「bbbb」
tの「bbbb」はタブ文字u0009と一致します。 (w+)t"NametAddrt"
rの"Namet"と"Addrt"は復帰文字u000Dと一致します。 (r は改行文字 n と同等ではありません。) rn(w+)「rHellonWorld」の「rnHello」は、垂直タブ u000B と一致します。
「vvv」の「vvv」は、フォームフィード文字u000Cと一致します。
「fff」の「fff」は改行文字u000Aと一致します。 "rnHello"
ern(w+)"rHellonWorld."はエスケープ文字u001Bと一致します。 「x001B」の
「x001B」は、文字を8進数表現で指定します(nnnは2~3桁)。
は、X または x で指定された ASCII 制御文字と一致します。X または x は制御文字の文字です。
は、Unicode文字(n​​nnnで表される4桁の数字)を16進表現で照合します。
の「a b」と「c d」は、認識できないエスケープ文字が後に続く場合に一致します。
文字クラス の説明 パターン
と一致します [character_group] はcharacter_group内の任意の単一文字と一致します。 デフォルトでは、照合では大文字と小文字が区別されます。 [mn]「mat」の「m」、「moon」の「m」と「n」
[^character_group]Non:character_group に含まれない任意の 1 文字と一致。 デフォルトでは、character_group 内の文字は大文字と小文字が区別されます。 [^aei]「avail」の「v」と「l」
[ first - last ]文字範囲: 最初から最後までの範囲内の任意の 1 文字と一致します。 (w+)t「NametAddrt」の「Namet」と「Addrt」
.ワイルドカード: n を除く任意の 1 文字と一致します。
元のピリオド文字 (. または u002E) と一致させるには、文字の前にエスケープ文字 (.) を付ける必要があります。
a.e「have」の「ave」、「mate」の「ate」
p{ name } および name 単一の Unicode ユニバーサル カテゴリまたは名前付きブロックの指定 文字マッチング。 p{Lu}「City Lights」
P{ name }の「C」と「L」は、で指定されていない単一のUnicodeユニバーサルカテゴリまたは名前付きブロックと同じではありません名前 文字の一致。 P{Lu}「City」
wの「i」、「t」、「y」は、任意の単語文字と一致します。 w「Room#1」の「R」、「o」、「m」、「1」
Wは、単語以外の文字と一致します。 W"Room#1"
sの「#」は、任意の空白文字と一致します。 ws「ID A1.3」の「D」
Sは、任意の非空白文字と一致します。 sS「int __ctr」
dの「_」は、任意の10進数の数字と一致します。 d「4 = IV」
Dの「4」は、10進数ではない任意の文字と一致します。 D「4 = IV」の「」、「=」、「」、「I」と「V」

アンカー

アンカーまたはアトミックゼロ幅アサーションは、文字列内の現在位置に応じて一致が成功または失敗しますが、エンジンが文字列内で進んだり、文字を使用したりすることはありません。

アンカー ポイントを次の表に示します。

アサーション説明パターン一致
^ 一致は文字列または行の先頭から開始する必要があります。 ^d{3}"567-777-"
$の「567」は、文字列の末尾、または行または文字列の末尾の n より前に出現する必要があります。 -d{4}$"8-12-2012"
Aの「-2012」は文字列の先頭に出現する必要があります。 Aw{4}"Code-007-"
Zの「コード」は、文字列の末尾、または文字列の末尾の n の前に出現する必要があります。 -d{3}Z"Bond-901-007"
zの「-007」は文字列の末尾に表示される必要があります。 -d{3}z"-901-333"
Gの「-333」は、前の一致が終了する場所に表示される必要があります。 \G(d)の「(1)」「(3)」「(5)」「(1)(3)(5)[7](9)」
b 一致は、w (英数字) 文字と W (英数字以外) 文字の間の境界で発生する必要があります。 w「Room#1」
Bの「R」、「o」、「m」、「1」の一致は、bの境界上で発生してはなりません。 Bendw*b「エンドはレンダーを送ります」の「エンド」と「エンダー」

グループ構造

グループ構造は正規表現の部分式を記述し、通常は入力文字列の部分文字列をキャプチャするために使用されます。

次の表に、グループ化構成要素を示します。

b(?!un)w+b「確実」と「使用済み」の「不明確実な単一性使用」(?< =部分式)(?<=19)d{2}b"1851 1999 1950 1905 2003"(?< ! 部分式) の "99"、"50"、および "05"(?< !19)d{2}b「endsendsendendenderlender」の「ends」と「ender」(?>部分式)[13579](?>A+B+)「1ABB 3ABBC 5AB 5AC」の「1ABB」、「3ABB」、「5AB」

インスタンス

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "1851 1999 1950 1905 2003";
      string pattern = @"(?<=19)\d{2}\b";

      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine(match.Value);
   }
}

インスタンスの実行 »

「インスタンスの実行」ボタンをクリックしてオンラインインスタンスを表示します

修飾子

修飾子は、一致が発生するために入力文字列内に前の要素 (文字、グループ、または文字クラス) のインスタンスがいくつ存在する必要があるかを指定します。 修飾子には、次の表にリストされている言語要素が含まれます。

次の表に修飾子を示します:

グループ化構成要素 説明 パターン 一致
(部分式) 一致をキャプチャします部分式を編集し、それをゼロベースの に代入します。シリアルナンバー。 (w)1"ee" in "deep"
(?< name >subexpression) は、一致する部分式を名前付きグループにキャプチャします。 (?<double>w)k<double>"deep"
(?<name1 -name2>subexpression)の「ee」はバランスの取れたグループの定義を定義します。 (((?'開く'()[^()]*)+((?'閉じる-開く'))[^()]*)+)*(?(開く)(?!))$ "((1-3)*(3-1))" in "3+2^((1-3)*(3-1))"
(?:部分式) 非キャプチャグループを定義します。 Write(?:Line)?「Console.WriteLine()」の「WriteLine」
(?imnsx-imnsx:subexpression)は、subexpressionで指定されたオプションを適用または無効にします。 Ad{2}(?i:w+)b「A12xl A12XL a12xl」内の「A12xl」および「A12XL」
(?= 部分式)ゼロ幅の正の先読みアサーション。 w+(?=.)「彼はいます。犬は走りました。太陽が出ています。」
(?!部分表現)の「is」、「ran」、「out」幅ゼロの否定先読みアサーション。
アサーションはゼロを確認した後に行われます幅 。
ゼロ幅のネガティブ ルックバック アサーション。
非バックデート(別名) "greedy" と同様) 部分表現。
修飾子 説明 パターン 一致
* 前の要素と 0 回以上一致します。 d*.d".0", "19.9", "219.9"
+は、前の要素と 1 回以上一致します。 「be+」「bee」の「been」、「bent」の「be」
?は、前の要素と 0 回または 1 回一致します。 "rai?n""ran", "rain"
{ n }は、前の要素と正確に n 回一致します。 ",d{3}""",043" in "1,043.6"、",876"、",543"、および ",210" in "9,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 回一致しますが、できるだけ少ない回数で一致します。 "rai??n""ran", "rain"
{ n }?は先頭の要素と正確に n 回一致します。 ",d{3}?",043" in ""1,043.6"、",876"、",543" および ",210" in "9,876,543,210"
{ n ,} ? 前の要素と少なくとも n 回、ただし可能な限り少ない回数一致します。 "d{2,}?""166"、"29"、および "1930"
{ n , m }? 前の要素が一致した回数は n からm ですが、できるだけ少ない回数にしてください。 「d{3,5}?」"166", "17668", 「193024」の「193」と「024」

後方参照の構築

後方参照を使用すると、同じ正規表現内で以前に一致した部分式を後から識別できます。

次の表は、後方参照構造のリストです。

​​の名前付き後方参照。 名前付き式の値と一致します。 (?< char>w)k< char> "ee" in "seek"
後方参照構造 説明 パターン
番号 後方参照と一致します。 数値の部分式の値と一致します。 (w)1「ee」の「seek」
k<名前>
代替構造

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

次の表は、代替構成のリストです。

代替構成 説明パターン は、は、垂直バーで区切られた任意の1つの要素と一致します(| )のキャラクター。 th(e|is|at)の「the」と「this」「this is the day.」if 正規表現パターン 指定されている場合式の一致により、それは (?(A)Ad{2}b|bd{3}b)「A10 C103 910」の「A10」と「910」名前または名前付きまたは番号付きキャプチャ グループが一致する場合は (?<引用>")?(?(引用).+?"|S+s)「Yiska遊び.jpg」内の「Dogs.jpg」と「Yiska遊び.jpg」

Replacement

Replacement は、置換パターンで使用される正規表現です。

次の表は、置換に使用される文字のリストです:

と一致します|
(?(式)yes | no )yes と一致し、それ以外の場合は、オプションの no 部分と一致します。式はゼロ幅アサーションとして解釈されます。
(?(名前)はい | いいえ) yes と一致し、それ以外の場合はオプションの no と一致します。
文字 説明 パターン 置換パターン 入力文字列 結果文字列
$ number部分文字列の置換一致グループ番号b(w+)(s)(w+)b$3$2$1"one two""two one"
${name}名前付きグループnameで置き換えます 一致する部分文字列。 b(?< word1>w+)(s)(?< word2>w+)b${word2} ${word1}「ワンツー」「ツーワン」
$$は文字「$」を置き換えます。 b(d+)s?USD$$$1"103 USD""$103"
$&は、一致全体のコピーを置き換えます。 ($*(d*(.+d+)?){1})**$&"$1.30""**$1.30**"
$`置換前の入力文字列のすべてのテキストと一致します。 B+$`"AABBCC""AAAACC"
$' 一致した入力文字列のすべてのテキストを置換します。 B+$'"AABBCC""AACCC"
$+は、最後にキャプチャされたグループを置き換えます。 B+(C+)$+"AABBCCDD"AACCDD
$_は、入力文字列全体を置き換えます。 B+$_"AABBCC""AAAABBCCCC"

その他の構成要素

次の表は、さまざまなその他の構成要素

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

Regexクラス

Regexクラスは正規表現を表すために使用されます。

次の表は、Regex クラスで一般的に使用されるいくつかのメソッドを示しています。 文字列入力 )

Regex コンストラクターで指定された正規表現が、指定された入力文字列で一致するかどうかを示します。 2public bool IsMatch( 文字列入力、 int 開始 )public static bool IsMatch( 文字列入力、 文字列パターン )パブリックマッチコレクションマッチ( 文字列入力 )public string Replace( 文字列入力、 文字列の置換 )public string[] Split( 文字列入力 )例 1
using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "A Thousand Splendid Suns";

         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}
次の例は、' で始まる単語と一致します。 S' 'm' で始まり 'e' で終わる単語:
using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";

         Console.WriteLine("Matching words start with 'm' and ends with 'e':");
         showMatch(str, @"\bm\S*e\b");
         Console.ReadKey();
      }
   }
}
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Regex コンストラクターで指定された正規表現が、文字列内の指定された開始位置から始まる指定された入力文字列内で一致を見つけるかどうかを示します。 3
指定された入力文字列内で指定された正規表現が一致するかどうかを示します。 4
指定された入力文字列内で出現する正規表現をすべて検索します。 5
指定された入力文字列内で、正規表現パターンに一致するすべての一致文字列を、指定された置換文字列に置き換えます。 6
Regex コンストラクターで指定された正規表現パターンで定義された位置に基づいて、入力文字列を部分文字列の配列に分割します。
Regex クラスのプロパティの完全なリストについては、Microsoft の C# ドキュメントを参照してください。
次の例は、'S' で始まる単語と一致します: 上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Matching words that start with 'S':
The Expression: \bS\S*
Splendid
Suns
例 2
Matching words start with 'm' and ends with 'e':
The Expression: \bm\S*e\b
make
maze
manage
measure

例 3

次の例は、余分なスペースを置き換えます:

using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "\s+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);

         Console.WriteLine("Original String: {0}", input);
         Console.WriteLine("Replacement String: {0}", result);    
         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

Original String: Hello   World   
Replacement String: Hello World