Longer answer: in a perl regular expression match, without the m option being applied to the match, a $ will match both the end of the string and, if the string ends in a newline, will also match right before the final newline. The s option does not change the behavior of $. It does, however, change the behavior of . so that . will match any character, up to and including newline.
But you did (.*?). That is, you made the .* match non-greedy, meaning that it took as few characters as possible, so it took everything before but not including the final newline, and then $ matched right before the final newline character.
The solution is to not make the second match non-greedy (i.e. use (.*) and not (.*?)), or to use something that really means just the end of the line and nothing else - that is, use \z instead of $.
All of this is fairly clearly explained by doing perldoc perlre, q.v.
In reply to Re: newline behavior in Regular Expression
by fizbin
in thread newline behavior in Regular Expression
by asinghvi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |