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

広告

後方参照では、マッチが終わった後から参照するだけではなく、パターン内で既にマッチした文字列を参照することも可能です。括弧()で囲まれたパターンにマッチした文字列はメタ文字の「¥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>」にマッチします。

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

サンプルプログラム

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

test5-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  if /<(div|span)>.*?<¥/¥1>/ =~ str then
    print(Kconv.tosjis("○") + str + "¥n")
  else
    print(Kconv.tosjis("×") + str + "¥n")
  end
end

print(Kconv.tosjis("<(div|span)>.*</¥¥1> にマッチするかどうか¥n¥n"))

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

上記のプログラムを「test5-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。

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

( Written by Tatsuo Ikura )