Ruby正規表現:末尾マッチ「$」「\Z」「\z」の違いを徹底解説

rubye6ada3e8a68fe8a1a8e78fbeefbc9ae69cabe5b0bee3839ee38383e38381e3808ce3808de3808cze3808de3808cze3808de381aee98195e38184e38292e5beb9

Rubyの正規表現では、マッチングの対象となる文字列の末尾を指定するために「$」や「Z」、「z」などのアンカー文字を使用します。これらのアンカー文字は似ているが、微妙な違いがあります。特に末尾マッチングにおいては、誤って使うと予期しない結果を引き起こすことがあるため、正しい使い方を理解することが重要です。本稿では、Rubyの正規表現における「$」、「Z」、「z」の末尾マッチングの違いについて徹底的に解説します。

Ruby正規表現:末尾マッチ「$」「Z」「z」の違いを徹底解説

Rubyの正規表現には、末尾マッチを表すために「$」「Z」「z」の3つのパターンが存在します。これらのパターンは、似ているように見えますが、実際には異なる挙動を示します。本節では、これらのパターンの違いを徹底的に解説します。

Rubyの末尾マッチ「$」

Rubyの正規表現では、「$」は文字列の末尾をマッチングするパターンです。例えば、以下の例では、「abc$」というパターンは、文字列「abc」の末尾をマッチングします。

irb(main):001:0> abc =~ /abc$/; p $~ => 0

しかし、「$」には注意する必要があります。MULTILINEモードでは、「$」は文字列の末尾ではなく、行の末尾をマッチングするようになります。

Rubyでファイル形式変換をマスター!TSV、CSV、JSONを自由自在に

MULTILINEモードにおける「$」の挙動

MULTILINEモードでは、「$」は行の末尾をマッチングするようになります。例えば、以下の例では、「abc$」というパターンは、文字列「abcndef」の各行の末尾をマッチングします。

irb(main):002:0> abcndef =~ /abc$/m; p $~ => 3

この挙動は、MULTILINEモードでのみ有効です。

Zの挙動

「Z」は、文字列の末尾をマッチングするパターンです。このパターンは、MULTILINEモードでも文字列の末尾をマッチングします。例えば、以下の例では、「abcZ」というパターンは、文字列「abcndef」の末尾をマッチングします。

irb(main):003:0> abcndef =~ /abcZ/; p $~ => 3

「Z」は、文字列の末尾をマッチングするパターンとして、MULTILINEモードでの挙動も考慮しています。

RustとLambdaで作る!後編:リクガメの食べ物検索ghomeアプリ開発

zの挙動

「z」は、文字列の末尾をマッチングするパターンです。このパターンは、MULTILINEモードでも文字列の末尾をマッチングします。ただし、「z」は、文字列の末尾にある空白文字を無視します。例えば、以下の例では、「abcz」というパターンは、文字列「abc ndef」の末尾をマッチングします。

irb(main):004:0> abc ndef =~ /abcz/; p $~ => 4

「z」は、文字列の末尾にある空白文字を無視するパターンとして、MULTILINEモードでの挙動も考慮しています。

末尾マッチのパターン比較

以下は、末尾マッチのパターンの比較表です。

パターン文字列MULTILINEモード
$末尾マッチ行の末尾マッチ
Z末尾マッチ末尾マッチ
z末尾マッチ(空白無視)末尾マッチ(空白無視)

この表から、末尾マッチのパターンの違いがわかります。

RxJava + MVVMパターンでストップウォッチアプリを作ろう

よくある質問

Rubyの正規表現で「$」と「\Z」と「\z」は何の違いがあるの?

Rubyの正規表現では、末尾マッチを表現するために「$」、「\Z」、「\z」の3種類のパターンを使用することができます。これらのパターンは、文字列の末尾をマッチングするために使用されるものですが、微妙な違いがあります。$は、文字列の末尾をマッチングするが、DosやUnix形式の改行コードを含む場合、改行コード以前の位置をマッチングします。一方、\Zは、文字列の末尾をマッチングするが、DosやUnix形式の改行コードを含む場合、改行コード自体をマッチングします。\zは、文字列の末尾をマッチングするが、DosやUnix形式の改行コードを含む場合、改行コード以前の位置をマッチングし、かつ末尾の改行コードを無視します。

末尾マッチ「$」は何をマッチングするの?

末尾マッチ「$」は、文字列の末尾をマッチングするパターンです。このパターンは、文字列の最後の文字の次の位置をマッチングします。しかし、DosやUnix形式の改行コードを含む場合、$は改行コード以前の位置をマッチングします。これは、Rubyの正規表現がDosやUnix形式の改行コードを含む文字列を扱う場合、改行コードを文字列の一部として扱うためです。

末尾マッチ「\Z」と「\z」の違いは何?

末尾マッチ「\Z」と「\z」は、文字列の末尾をマッチングするパターンです両方のパターンは、文字列の末尾をマッチングするが、微妙な違いがあります。\Zは、文字列の末尾をマッチングするが、DosやUnix形式の改行コードを含む場合、改行コード自体をマッチングします。一方、\zは、文字列の末尾をマッチングするが、DosやUnix形式の改行コードを含む場合、改行コード以前の位置をマッチングし、かつ末尾の改行コードを無視します。

Rubyの正規表現では末尾マッチをどのように使用するべきか?

Rubyの正規表現では、末尾マッチを使用する場合、DosやUnix形式の改行コードを含む文字列を扱う場合を考慮する必要があります。$\Z\zの3種類のパターンを適切に選択して使用することで、望みの結果を得ることができます。例えば、文字列の末尾をマッチングするだけであれば、$を使用することができますが、DosやUnix形式の改行コードを含む場合、\Z\zを使用する必要があります。

Rで系統樹をビジュアル化!apeとggtreeの使い方
レン、「技術分野における最高のガイド」の創設者です。

レン、「技術分野における最高のガイド」の創設者です。

私は職業としてのエンジニアではありませんが、情熱としてのエンジニアです。技術分野における最高のガイドを立ち上げたのは、デジタル世界のあらゆる知識やリソースを紹介するためです。すべてをよりシンプルで理解しやすい視点から誰にでも伝えられるよう心がけています。