パターン内で後方参照を行う(\1, \2, ..)

後方参照は、マッチが終わったあとで参照するだけではなく、パターン内で既にマッチした文字列を参照することも可能です。ここでは Ruby の正規表現でパターン内での後方参照を行う方法について解説します。

(Last modified: )

パターン内での後方参照

後方参照では、マッチが終わった後から参照するだけではなく、パターン内で既にマッチした文字列を参照することも可能です。括弧()で囲まれたパターンにマッチした文字列はメタ文字の \1 \2 ...でパターン内から参照できます。

具体的な例で確認します。

/(RED|red)\1/

上記の場合、「(RED|red)」にマッチするかどうかが行われます。マッチした場合はこの部分が括弧で囲まれていますので後方参照が可能です。そして \1 は最初の括弧内のパターンにマッチした文字列にマッチします。

例えば最初の括弧内のパターンに対して「RED」がマッチした場合は \1 も「RED」にマッチします。「red」がマッチしていた場合は \1 も「red」にマッチします。

つまり先ほどの正規表現は正規表現と同じです。

/(REDRED|redred)/

次の例は<h1>で始まる場合は</h1>までを、<h2>で始まる場合は</h2>までをマッチさせる正規表現を考えてみます。

/<(h1|h2)>.*?<\/\1>/

「<(h1|h2)>」で「<h1>」にマッチした場合は「<\/\1>」は「</h1>」にマッチし、「<(h1|h2)>」で「<h2>」にマッチした場合は「<\/\1>」は「</h2>」にマッチします。

このようにパターン内で後方参照を行うことで、既にマッチした部分文字列を同じものにマッチさせるといった正規表現オブジェクトを作成することが可能になります。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

def check(str)
  if /<(div|span)>.*?<\/\1>/ =~ str then
    puts("○" + str)
  else
    puts("×" + str)
  end
end

puts("<(div|span)>.*</\\1> にマッチするかどうか")

check("Today is <div>Tuesday</div>")
check("<p>Border Color is <span>red</span></p>")
check("<span>Hello</div>")

下記のように実行して下さい。

パターン内での後方参照(\1, \2, ..)

-- --

Ruby の正規表現でパターン内での後方参照を行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。