ホームページ >バックエンド開発 >C#.Net チュートリアル >C# 正規表現メタキャラクターの詳細な説明

C# 正規表現メタキャラクターの詳細な説明

angryTom
angryTomオリジナル
2019-11-29 17:36:422935ブラウズ

この記事では、C# 正規表現のメタキャラクタについて整理します。正規表現は、文字で構成される式です。各文字はルールを表します。式内の文字は、通常の文字とメタキャラクタの 2 種類に分類されます。通常の文字は、文字通りの意味が変更されず、テキストと完全に一致する文字を指しますが、メタ文字は特別な意味を持ち、文字の種類を表します。

C# 正規表現メタキャラクターの詳細な説明

テキストを文字のストリームとして扱い、各文字を所定の位置に配置します。たとえば、正規表現「Room\d\d\d」、最初の 4 つは、 Room という文字は通常の文字で、次の文字 \ はエスケープ文字です。次の文字 d とともにメタキャラクタ \d を形成します。これは、その位置に任意の数値があることを意味します。

C# 正規表現メタキャラクターの詳細な説明

正規表現の言語で説明: 正規表現「Room\d\d\d」は合計 7 文字をキャプチャします。これは、「」を意味します。 「Room」で始まり 3 つの数字で終わる文字列の一種。この種類の文字列をパターン (Pattern) と呼び、通常のパターンとも呼ばれます。

1. エスケープ文字

エスケープ文字は \ で、通常の文字を特別な意味を持つメタ文字にエスケープします。一般的に使用されるエスケープ文字は次のとおりです:

\t: 水平タブ文字

\v: 垂直タブ文字

\r: キャリッジリターン

\n: 改行

\ \: 文字 \ を表します。つまり、エスケープ文字 \ を通常の文字 \

\": 文字 " を表します。C# では、文字列の定義に二重引用符が使用されます。文字列に含まれる文字列は「

2」で表されます。 文字クラス

通常のマッチングを行う場合、入力された文字列が考慮されます。シーケンスされた文字ストリームとして. 文字クラスのメタキャラクタマッチングの対象は文字であり, その文字がキャプチャされます. いわゆるキャプチャされた文字とは, あるメタキャラクタによってキャプチャされた文字が他のメタキャラクタによって一致しないことを意味します. 後続のメタキャラクタはのみ可能です.

一般的に使用される文字クラスのメタ文字:

[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: 任意の非数値文字と一致します

注 、エスケープ文字は文字クラスのメタ文字にも属しており、通常の一致を実行するときに文字もキャプチャされます。

3. ロケーター

ロケーター マッチング (またはキャプチャ) は位置であり、文字の位置に基づいてパターン マッチングが成功したかどうかを決定します。文字をキャプチャせず、幅がゼロです (幅は 0)。一般的に使用されるロケーターは次のとおりです:

^: デフォルトでは、文字列の開始位置と一致します。複数行モードでは、文字列の開始位置と一致します。各行の位置;

$: デフォルトでは、文字列の終了位置、または文字列の末尾に一致します複数行モードの \n; の前​​の位置は、各行の末尾の前の位置に一致します行、または各行末の \n より前の位置

\A: 文字列の開始位置と一致します;

\Z: 文字列の終了位置と一致します、または文字列の末尾の \n より前の位置;

\z: 文字列の終了位置と一致;

\G: 前の一致の終了位置と一致;

\b: 単語の先頭または終了位置と一致します;

\B: 単語の中間位置と一致します;

C# 正規表現メタキャラクターの詳細な説明

#4. 量指定子、Greedy と Lazy

Quantifiers は、以前の規則的なパターンの出現数を制限することを指します。Quantifiers は 2 つのモードに分かれています: Greedy モードと Lazy モード、Greedy モードとは、できるだけ多くの文字を一致させるのに対し、遅延モードはできるだけ少ない文字を一致させることを意味します。デフォルトでは、量指定子は貪欲モードになっています。遅延モードを有効にするには、量指定子の後に ? を追加します。

*: 0 回以上発生します

: 1 回以上発生します

?: 0 回以上発生します

{n} : n 回出現します

{n,}: n 回以上出現します

{n,m}: n 回から m 回出現します

注、複数出現します。は、先行するメタキャラクタが複数回出現することを意味します。たとえば、\d{2} は \d\d​​ と同等ですが、出現する数値は 2 つだけであり、2 つの数値が同じである必要はありません。同じ 2 つの数値を表すには、グループ化を使用する必要があります。

C# 正規表現メタキャラクターの詳細な説明

5. 文字のグループ化とキャプチャ

() 括弧は式の範囲を決定するだけでなく、グループも作成します。() 内の式はグループです。参照グループは、2 つのグループに一致するテキストがまったく同じであることを意味します。グループを定義するための基本構文:

(pattern)

このタイプのグループ化では文字がキャプチャされます。いわゆるキャプチャ キャラクタとは次のことを指します: メタキャラクタによってキャプチャされた文字は、他のメタキャラクタとは一致しません。後続のメタキャラクタは、残りのテキストを再照合してから取得します。

1. グループの番号付けと名前付け

デフォルトでは、各グループにグループ番号が自動的に割り当てられます。ルールは次のとおりです: 左から右へ、グループの左括弧の順序で番号が付けられます。 1 つのグループのグループ番号は 1、2 番目のグループのグループ番号は 2 というようになります。グループの名前を指定することもできます。このグループは名前付きグループと呼ばれます。名前付きグループにも自動的に番号が付けられます。番号は 1 から始まり、1 つずつ増加します。グループの名前を指定する構文は次のとおりです。 :

(?< name > pattern)

一般に、グループは名前付きグループと番号付きグループに分けられます。グループを参照する方法は次のとおりです:

グループ名でグループを参照:\k

グループ番号によるグループの参照:\番号

グループ化は逆方向のみ参照できることに注意してください。つまり、正規表現テキストの左側から開始して、最初にグループ化を定義し、次にグループ化を定義する必要があります。定義後に参照できます。

正規表現でグループを参照するための構文は「\number」です。たとえば、「\1」はグループ 1 に一致する部分文字列を表し、「\2」はグループ 2 に一致する文字列を表します。 。

たとえば、「.*?\1>」は、グループを参照する場合、

valid

に一致します。グループは全く同じです。

2. グループ コンストラクター

グループの構築方法は次のとおりです:

(パターン): 一致する部分式をキャプチャし、グループ番号をグループに割り当てます

(? pattern): 一致する部分式を名前付きグループにキャプチャします

##(?:pattern): キャプチャされていないグループ、グループ解除され、グループ番号が割り当てられます。

(?> パターン): 貪欲なグループ化

3、貪欲なグループ化

貪欲なグループ化は非バックトラッキング グループとも呼ばれます。このグループ化はバックトラッキングを無効にします。正規表現エンジンは一致します。入力テキストにできるだけ多くの文字を含めます。これ以上一致できない場合、追加のパターン一致を試みるために後戻りすることはできません。

(?> pattern )

4. 2 つのうち 1 つを選択してください

| は、または、2 つのうちのいずれかに一致することを意味します。 | は左側と右側の式を 2 つの部分に分割していることに注意してください。

pattern1 | pattern2

6、ゼロ幅アサーション

ゼロ幅は幅が 0 であり、一致するのは位置であることを意味します。したがって、一致する部分文字列は一致結果には表示されず、アサーションは判定結果を指します。アサーションが true の場合にのみ、一致が成功したと見なされます。

ロケーターの場合、文の先頭と末尾

(^ $) または単語の先頭と末尾 (\b) を一致させることができます。メタキャラクター 特定の文字と一致するのではなく、位置のみに一致し、その位置が特定の条件を満たすことを指定するため、これらはゼロ幅アサーションと呼ばれます。いわゆるゼロ幅とは、どの文字にも一致しないが位置に一致することを意味します。いわゆるアサーションは判断を指し、正規表現はアサーションが true の場合にのみ一致し続けます。ゼロ幅アサーションは、単に文や単語を指定するのではなく、正確な位置と一致させることができます。

正規表現は、テキストを左から右への文字の流れとして扱います。右への移動は後方

(後ろを見る) と呼ばれ、左への移動は前方 (前方への視線) と呼ばれます。 ) 。正規表現の場合、指定したパターン (Pattern) に一致した場合にのみ、アサーションが True (肯定的な式と呼ばれます) となり、一致しないパターンが True (否定的な式と呼ばれます) になります。

マッチングの方向とマッチングの質的性質に応じて、ゼロ幅アサーションは 4 つのタイプに分類されます。

(?= パターン): 前方、肯定的なアサーション

(?! パターン): 前方、否定的なアサーション

(?(?
1. 前方肯定的なアサーション

前方肯定的なアサーションは、パターンがテキストの末尾 (または右側) に存在する必要があるが、パターンと一致する部分文字列は存在しないことを定義します。一致結果では、前方アサーションは通常、正規表現の右側に表示され、テキストの右側が特定のパターンを満たす必要があることを示します。

 (?= subexpression )

前方肯定アサーションを使用してあいまい一致を定義します。接尾辞には特定の文字が含まれている必要があります:

\b\w+(?=\sis\b)

正規表現を分析します:

\b: 単語の境界を示します

\w: 単語が次の位置に出現することを示します少なくとも 1 回

(?=\sis\b): 前方肯定的なアサーション。\s は空白文字を表し、is は通常の文字で完全に一致し、\b は単語の境界です。

分析の結果、正規表現に一致するテキストには is という単語が含まれている必要があると結論付けることができます。is は単語の一部ではなく、別の単語です。例えば###

Sunday is a weekend day 匹配该正则,匹配的值是Sunday,而The island has beautiful birds 不匹配该正则。

2、后向肯定断言

后向肯定断言定义一个模式必须存在于文本的开始(或左侧),但是该模式匹配的子串不会出现在匹配的结果中,后向断言通常出现在正则表达式的左侧,表示文本的左侧必须满足特定的模式:

(?<= subexpression )

使用后向肯定断言可以定一个模糊匹配,前缀必须包含特定的字符:

(?<=\b20)\d{2}\b

对正则表达式进行分析:

(?

\d{2}:表示两个数字,数字不要求相同

\b:单词的边界

该正则表达式匹配的文本具备的模式是:文本以20开头、以两个数字结尾。

七,用正则从格式化的文本中扣值

有如下的JSON格式的文本,从文本中扣出字段(CustomerId、CustomerName、CustomerIdSource和CustomerType)的值:

{"CustomerDetails":"[{\"CustomerId\":\"57512f19\",\"CustomerName\":\"cust xyz\",\"CustomerIdSource\":\"AadTenantId\",\"CustomerType\":\"Enterprise\"}]"}

注意,该文本转换为C#中的字符时,需要对双引号和转义字符进行转义。由于这四个字段提取规则相同,可以写一个通用的模式来提取:

public static string GetNestedItem(string txt, string key)
{
    string pat = string.Format("(?<=\\\\\"{0}\\\\\":\\\\\").*?(?=\\\\\")", key);
    return Regex.Match(txt, pat, RegexOptions.IgnoreCase).Value;
}

正则表达式得解析:

(?

.*?:懒惰模式,匹配尽可能少的文本

(?=\\\\\"):前向断言,用于匹配字段值得双引号

本文来自 C#.Net教程 栏目,欢迎学习!  

以上がC# 正規表現メタキャラクターの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。