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

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の使い方






