名前付きキャプチャで記録した内容を複数個所でマッチさせたい
名前付きキャプチャ は正規表現にマッチした内容(テキスト)そのものをキャプチャ(記録)し、正規表現の別の箇所で参照してマッチさせることができます。
例えば 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で確認すると以下のようにマッチしていることと、キャプチャ内容が確認できます。
以上。
コメントを書く