はじめに
こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
前回正規表現についての記事を書きましたが、コメントでいくつか指摘をいただき理解できていない部分があることを知り改めて勉強になりました。
その中で、 \Aと^の違い、\zと$の違いについて触れていただけて知ってはいるものの、理解度を深めるために簡単ではありますが、記事にまとめようと思いました。
\A と ^ の違い
\A は「文字列の先頭」にのみ一致します。
一方、^ は「行頭」に一致します。
理解度を上げるために具体例を見てみましょう
text = "Hello world\nThis is Ruby"
# \A の場合
puts text =~ /\AHello/ # => 0(文字列の先頭 "Hello" にマッチ)
puts text =~ /\AThis/ # => nil (文字列の先頭ではないのでマッチしない)
# ^ の場合
puts text =~ /^This/ # => 12(2行目の行頭 "This" にマッチ)
puts text =~ /^Hello/ # => 0(1行目の行頭 "Hello" にマッチ)
\A は「文字列全体の先頭」でしかマッチしないため、This にはマッチしません。
一方、^ は行頭にマッチするので、複数行に対応し、各行の最初の文字にマッチしていることがわかります。
\z と $ の違い
\z は「文字列の末尾」にのみ一致します。
一方、$ は「行末」に一致します。
上記同様、具体例を見てみましょう。
text = "Hello world\nThis is Ruby\n"
# \z の場合
puts text =~ /Ruby\z/ # => nil("Ruby" の後に改行があるため一致しない)
puts text =~ /\n\z/ # => 21(改行が文字列の末尾なので一致)
# $ の場合
puts text =~ /Ruby$/ # => 17(2行目の行末 "Ruby" にマッチ)
puts text =~ /\n$/ # => 21(改行が行末にマッチ)
\z は「文字列の末尾」にしかマッチしないため、Rubyではなく\zにマッチしています。
改行の\nも含めての「文字列の末尾」なので注意しましょう。
$ は各行の末尾に対応し、改行前や行末に一致します。
なお、$の行末の扱いについては、わたしからではなく、以下の記事を見ていただくと理解度が深まるとおもうので参考にしてみてください。
まとめ
今回はちゃんと自分が理解できているかの確認と、違いがわからずに進んでいる方向けにそれぞれの違いを書いてみましたので最後にまとめておきたいと思います
-
\A
文字列の先頭にマッチする -
^
各行の行頭にマッチする -
\z
文字列の完全な末尾にマッチする -
$
各行の行末または文字列の末尾にマッチする