書きかけだった正規表現のページを書き始めた

はっきり言って、正規表現は苦手。正規表現は、日常的に使うけれど、他人に正確に説明するほどの自身はない。

特に覚えられないのが、ここ。

  • ^ …… 行頭。文字列の先頭や改行文字の直後の位置にマッチします。
  • $ …… 行末。文字列の末尾や改行文字の直前の位置にマッチします。改行自身は含みません。
  • \A …… 文字列先頭。^ とは異なり改行の有無には影響しません。
  • \Z …… 文字列末尾。文字列が改行で終っていればその改行の直前にマッチします。
  • \z …… 文字列末尾。$ や \Z とは異なり改行の有無には影響しません。

整理しよう。

まず、「^」と「$」。この2つは行頭と行末にマッチする。そして、文字列の先頭と文字列の末尾にもマッチする。うん、これはOK。

次に、「\A」と「\z」。これらは改行があろうがなかろうが関係ない。改行は無視して、単純に文字列の先頭と末尾にマッチする。これもOK。

最後に「\Z」。これはなんだろう。「文字列が改行で終っていればその改行の直前にマッチします。」って。改行で終わっている文字列とは、次のような文字列だよな。

"hello\n"

で、その改行の直前にマッチすると。試してみよう。

"hello\n" =~ /.\Z/
p $&    #=> "o"

"hello\n" =~ /.\z/
p $&    #=> nil

"hello\n" =~ /.\z/m
p $&    #=> "\n"

ふうむ。わかったようなわからないような。