Search for newlines at end of string, not at end of line
$ matches both end of string and end of line.
so /\n$/ matches \n\n anywhere in the string.
while /\n\Z/ only matches \n at the end of the string.
irb(main):021:0> "a\n\nb" =~ /\n$/ => 1 irb(main):022:0> "a\n\nb" =~ /\n\Z/ => nil irb(main):023:0> "a\n\nb\n" =~ /\n$/ => 1 irb(main):024:0> "a\n\nb\n" =~ /\n\Z/ => 4