名前付きキャプチャで記録した内容を複数個所でマッチさせる正規表現 [C#]

名前付きキャプチャで記録した内容を複数個所でマッチさせる正規表現 [C#]

名前付きキャプチャで記録した内容を複数個所でマッチさせたい

名前付きキャプチャ は正規表現にマッチした内容(テキスト)そのものをキャプチャ(記録)し、正規表現の別の箇所で参照してマッチさせることができます。

例えば XML や HTML のタグにマッチさせたいときに開始タグの正規表現でマッチした内容をキャプチャしておき、終了タグの正規表現で参照するといったことが可能になります。

名前付きキャプチャの使い方

構文

正規表現でのコンストラクトのグループ化 | Microsoft Docs

名前付きで正規表現に一致した内容をキャプチャするには以下のように書きます。

`(?<name>subexpression)`

name の部分には任意の名前を指定できます。subexpression には任意の正規表現が入ります。

これで name という名前で subexpression に一致した内容をキャプチャでき、参照することが可能になります。

また、キャプチャした内容を同じ正規表現内で利用するには以下のようにします。

\k<name>

name はキャプチャした時に指定した名前を入れます。

\k<name> はキャプチャした内容にマッチする正規表現となります。

HTMLでタグを抽出する正規表現サンプル

例えば HTML から見出しタグ(<h1> ~ <h6>)すべてにマッチさせる正規表現は、名前付きキャプチャを使って以下のように書けます。

<(?<tag>h[1-6])>.*<\/\k<tag>>

分解すると以下のようになります。

  • <: 開始タグの開きカッコにマッチ
  • (?<tag>h[1-6]) h1~h6にマッチした内容を tag という名前でキャプチャ
  • >: 開始タグの閉じカッコにマッチ
  • .* 終了タグまでの任意文字列にマッチ
  • <\ 終了タグの開きカッコにマッチ
  • \k<tag> tag という名前でキャプチャされた内容にマッチ
  • >: 終了タグの閉じカッコにマッチ

開始タグの正規表現 h[1-6] で一致した内容をキャプチャし、終了タグで参照しているため、終了タグでは開始タグ内容と同じタグ名に一致することになります。

Rubular: <(?h[1-6])>.*<\/\k>

Rubularで確認すると以下のようにマッチしていることと、キャプチャ内容が確認できます。

たいていのプログラミング言語ではキャプチャした内容を参照したテキストのみを抽出したり、置換したりすることが可能です。

以上。

C#カテゴリの最新記事