この記事では、C# 正規表現のメタキャラクタについて整理します。正規表現は、文字で構成される式です。各文字はルールを表します。式内の文字は、通常の文字とメタキャラクタの 2 種類に分類されます。通常の文字は、文字通りの意味が変更されず、テキストと完全に一致する文字を指しますが、メタ文字は特別な意味を持ち、文字の種類を表します。 テキストを文字のストリームとして扱い、各文字を所定の位置に配置します。たとえば、正規表現「Room\d\d\d」、最初の 4 つは、 Room という文字は通常の文字で、次の文字 \ はエスケープ文字です。次の文字 d とともにメタキャラクタ \d を形成します。これは、その位置に任意の数値があることを意味します。 正規表現の言語で説明: 正規表現「Room\d\d\d」は合計 7 文字をキャプチャします。これは、「Room で始まり、終わる」ことを意味します。 with 3 桁で終わる文字列の一種。この種類の文字列をパターン (パターン) と呼び、通常のパターンとも呼ばれます。 1. エスケープ文字 エスケープ文字は \ で、通常の文字を特別な意味を持つメタ文字にエスケープします。 : \t: 水平タブ文字 \v: 垂直タブ文字 \ r: キャリッジ リターン \n: ライン フィード \\: 文字 \ を表します。つまり、エスケープします。エスケープ文字 \ を通常の文字 \ \": は文字" に変換します。C# では、文字列を定義するために二重引用符が使用されます。文字列に含まれる二重引用符には \" が使用されます。第 2 に、文字クラス は、入力テキストをシーケンシャル文字ストリーム内の文字クラス メタ文字として扱います。マッチ キャラクタとキャプチャ キャラクタ。いわゆるキャプチャ キャラクタは、1 つのメタキャラクタによってキャプチャされた文字が他のメタキャラクタによって照合されず、後続のメタキャラクタは残りのメタキャラクタからのみ照合できることを意味します。テキスト内で再度照合します。 一般的に使用される文字クラスのメタ文字: [char_group]: 文字グループ内の任意の文字と一致します [^char_group]:文字グループを除く任意の文字に一致 [first-last]: 最初から最後までの文字範囲に一致 任意の文字 (文字範囲には最初と最後が含まれます) .: ワイルドカード。\n \w# を除く任意の文字に一致します。 ##: 任意の単語文字に一致します。通常、単語文字は A ~ Z、a ~ z、0 ~ 9 を指します。 \W: A-Z を除く、単語以外の文字と一致します。 、a-z、0-9 以外の文字 \s: 任意の空白文字と一致します \S: 空白以外の任意の文字と一致します。 文字 \d: 任意の数字と一致します。 \D: 数値以外の文字と一致します 注、エスケープ文字は文字クラスのメタ文字にも属しており、通常の一致を実行するときに文字もキャプチャされます。 ## 三、ロケータ ロケータ マッチング (またはキャプチャ) の対象は位置であり、文字の位置に基づいてパターン マッチングが成功したかどうかを判断します。文字で幅がゼロです (幅は 0)。一般的に使用されるロケーターは次のとおりです: ^: デフォルトでは、文字列の先頭に一致します。複数行モードでは、各行の先頭と一致します; $: デフォルトでは、文字列の終了位置、または文字列の末尾の \n より前の位置と一致します; 複数行の場合モードでは、各行の末尾より前の位置、または各行の末尾の \n より前の位置と一致します。 \A: 文字列の開始位置と一致します; \Z: 文字列の終了位置、または \n と一致します。文字列の終わり 前の位置; \z: 文字列の終了位置と一致します; \G: 文字列の終了位置と一致します前の一致; \b: 単語の先頭または末尾と一致; \B: 単語の中間位置と一致; 4. 量指定子、欲張りと怠惰 量指定子とは、次の出現回数を制限することを指します。以前の規則的なパターン. 量指定子は次の 2 つのモードに分けられます: 貪欲モードと遅延モード. 貪欲モードはできるだけ多くの文字に一致することを意味し、遅延モードはできるだけ少ない文字に一致することを意味します。デフォルトでは、量指定子は貪欲モードになっています。遅延モードを有効にするには、量指定子の後に ? を追加します。 *: 0 回以上発生 : 1 回以上発生 ? : 0 回または 1 回出現します {n}: n 回出現します {n,}: n 回以上出現します {n,m}: n ~ m 回出現します 複数出現するということは、先行するメタキャラクターが複数回出現することを意味することに注意してください (例: \d {2})は \d\d と同等ですが、2 つの数値が表示され、2 つの数値が同じである必要はない点が異なります。同じ 2 つの数値を表すには、グループ化を使用する必要があります。 5. 文字のグループ化とキャプチャ () 括弧は式の範囲を決定するだけではありません、ただし、グループを作成するには、() 内の式がグループであり、参照グループは、2 つのグループに一致するテキストがまったく同じであることを意味します。グループ化を定義するための基本的な構文: (pattern) このタイプのグループ化では文字がキャプチャされます。いわゆるキャプチャ文字とは、 to: a 要素characters によってキャプチャされた文字は、他のメタキャラクターとは照合されず、後続のメタキャラクターは残りのテキストからのみ再照合できます。 1、グループ番号と名前 デフォルトでは、各グループにはグループ番号が自動的に割り当てられます。ルールは次のとおりです: 左括弧に従って、左から右へグループのグループ 出現順に番号が付けられ、最初のグループのグループ番号は 1、2 番目のグループのグループ番号は 2 になります。グループの名前を指定することもできます。このグループは名前付きグループと呼ばれます。名前付きグループにも自動的に番号が付けられます。番号は 1 から始まり、1 つずつ増加します。グループの名前を指定する構文は次のとおりです。 : (?< 名前 > パターン)## 一般に、グループは名前付きグループと番号付きグループに分けられます。グループを参照する方法は次のとおりです: グループ名でグループを参照:\kグループ番号によるグループの参照:\ 番号 グループは逆方向にのみ参照できることに注意してください。つまり、正規表現テキストの左側から開始して、グループを次のように指定する必要があります。後で参照できるようになる前に定義されます。 正規表現でグループを参照するための構文は「\number」です。たとえば、「\1」はグループ 1 に一致する部分文字列を表し、「\2」はグループ 2 に一致する文字列を表します。 。 たとえば、「<(.*?)>.*?\1>」は、グループを参照する場合、valid に一致します。グループは全く同じです。 2、グループ化コンストラクター グループ化の構築方法は次のとおりです。 (パターン): キャプチャ一致する部分式を取得し、グループ番号をグループに割り当てます #(?< name > pattern): 一致する部分式を名前付きグループにキャプチャします # (?:パターン): 非キャプチャ グループ化、グループ番号がグループに割り当てられていない (?> パターン): 貪欲なグループ化 3, 貪欲なグループ化 貪欲なグループ化は、非バックトラッキング グループとも呼ばれます。このグループ化により、バックトラッキングが無効になります。正規表現エンジンは、入力テキスト内の可能な限り多くの文字と一致します。キャラクター。これ以上一致できない場合、追加のパターン一致を試みるために後戻りすることはできません。 (?> パターン ) 4、2 つのうち 1 つを選択します | | は、左側と右側の式を 2 つの部分に分割していることに注意してください。 pattern1 | pattern2 6、ゼロ幅アサーション ゼロ幅は幅が 0 であり、一致は位置であることを意味します。 substring will はマッチング結果に現れず、アサーションは判定結果を指し、アサーションが true の場合にのみマッチングが成功したとみなします。 ロケーターの場合、文の先頭と末尾 (^ $) または単語の先頭と末尾 (\b) を照合できます。これらのメタ文字は 1 つの位置のみに照合し、この位置が指定されることを指定します。したがって、特定の文字と一致するのではなく、特定の条件を満足することは、ゼロ幅アサーションと呼ばれます。いわゆるゼロ幅とは、どの文字にも一致しないが位置に一致することを意味します。いわゆるアサーションは判断を指し、正規表現はアサーションが true の場合にのみ一致し続けます。ゼロ幅アサーションは、単に文や単語を指定するのではなく、正確な位置と一致させることができます。 正規表現では、テキストを左から右への文字の流れとして扱います。右への移動は後方 (後ろを見る) と呼ばれ、左への移動は前方 (先を見る) と呼ばれます。正規表現の場合、指定されたパターン (Pattern) に一致する場合にのみ、アサーションが True (肯定的な式と呼ばれます) となり、一致しないパターンが True (否定的な式と呼ばれます) になります。 マッチングの方向とマッチングの質的性質に応じて、ゼロ幅アサーションは 4 つのタイプに分類されます。 (?= pattern):前向、肯定断言 (?! pattern):前向、否定断言 (?<= pattern):后向、肯定断言 (? pattern):后向、否定断言 1,前向肯定断言 前向肯定断言定义一个模式必须存在于文本的末尾(或右侧),但是该模式匹配的子串不会出现在匹配的结果中,前向断言通常出现在正则表达式的右侧,表示文本的右侧必须满足特定的模式: (?= subexpression ) 使用前向肯定断言可以定一个模糊匹配,后缀必须包含特定的字符: \b\w+(?=\sis\b) 对正则表达式进行分析: \b:表示单词的边界 \w+:表示单词至少出现一次 (?=\sis\b):前向肯定断言,\s 表示一个空白字符, is 是普通字符,完全匹配,\b 是单词的边界。 从分析中,可以得出,匹配该正则表达式的文本中必须包含 is 单词,is是一个单独的单词,不是某一个单词的一个部分。举个例子 Sunday is a weekend day 匹配该正则,匹配的值是Sunday,而The island has beautiful birds 不匹配该正则。 2,后向肯定断言 后向肯定断言定义一个模式必须存在于文本的开始(或左侧),但是该模式匹配的子串不会出现在匹配的结果中,后向断言通常出现在正则表达式的左侧,表示文本的左侧必须满足特定的模式: (?<= subexpression ) 使用后向肯定断言可以定一个模糊匹配,前缀必须包含特定的字符: (?<=\b20)\d{2}\b 对正则表达式进行分析: (?<=\b20):后向断言,\b表示单词的开始,20是普通字符 \d{2}:表示两个数字,数字不要求相同 \b:单词的边界 该正则表达式匹配的文本具备的模式是:文本以20开头、以两个数字结尾。 推荐学习:C#.Net教程