文字列の末尾にマッチする(\Z, \z)

メタ文字の「^」と「$」はそれぞれ行の先頭と末尾にマッチするものでしたが、文字列の先頭と末尾にマッチするものも用意されています。「\Z」および「\z」は文字列の末尾にだけマッチします。ここでは Ruby の正規表現で文字列の先頭にマッチするメタ文字の「\Z」と「\z」の使い方について解説します。

(Last modified: )

文字列の末尾にマッチする

メタ文字の \Z は文字列の末尾にマッチします。書式は次の通りです。

/パターン\Z/

具体的な例で考えてみます。「abc\ndef」と「def\nabc」と言う2つの文字列に対してパターンを /abc$/ と指定した場合にはどちらの文字列にも行の末尾に「abc」は含まれているため、どちらもマッチします。

abc\ndef
○ def\nabc

これに対してパターンを /abc\Z/ と記述した場合は、文字列の末尾の位置に「abc」がある場合だけマッチします。よって「abc\ndef」はマッチしませんが「def\nabc」はマッチします。

× abc\ndef
○ def\nabc

具体的には次のように記述します。

str = "def\nabc"

if /abc\Z/ =~ str then
  print("マッチします\n")
else
  print("マッチしません\n")
end

\Zと\zの違い

注意する点として \A とは異なり \Z は文字列の最後が改行で終わっている場合だけは改行の直前にマッチします。

例としてパターンを /abc\Z/ と記述した場合は「def\nabc」だけではなくて「def\nabc\n」にもマッチします。

○ def\nabc
○ def\nabc\n

文字列の最後の改行を特別扱いせず、文字列の末尾にだけマッチさせたい場合には \Z の代わりに \z を使います。

メタ文字の \z の書式は次の通りです。

/パターン\z/

例としてパターンを /abc\z/ と記述した場合は「def\nabc」にはマッチしますが「def\nabc\n」にはマッチしません。

○ def\nabc
× def\nabc\n

間違えやすい部分でもありますので、注意して利用して下さい。

サンプルコード

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

# encoding: UTF-8

def check1(str)
  print(str + " は abc$ に")

  if /abc$/ =~ str then
    puts("マッチします")
  else
    puts("マッチしません")
  end
end

def check2(str)
  print(str + " は abc\\Z に")

  if /abc\Z/ =~ str then
    puts("マッチします")
  else
    puts("マッチしません")
  end
end

def check3(str)
  print(str + " は abc\\z に")

  if /abc\z/ =~ str then
    puts("マッチします")
  else
    puts("マッチしません")
  end
end

check1("abc\ndef")
check1("def\nabc")
check2("abc\ndef")
check2("def\nabc")
check2("def\nabc\n")
check3("def\nabc\n")

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

文字列の末尾(\Z, \z)

-- --

Ruby の正規表現で文字列の先頭にマッチするメタ文字の「\Z」と「\z」の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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