$ is a zero-width assertion that matches at the end of the string, or just before the newline at the end of the string (note its behavior can be changed by the /m modifier). ? makes the preceding .* non-greedy, so that it allows $ to match just before the newline, while a normal .* is greedy, causing it to gobble up everything it can, and the $ matches just after the newline. Note that since you're using the /s modifier, the dot . can also match a newline, which it normally does not.
What is your desired behavior? If you want the match to always include the newline, I'd be specific about it: /ab.*\n/, or, if you want the newline to be optional (e.g. the last line in a file may not have a newline), then I'd probably write /ab.*(?:\z|\n)/. If you want the match to always exclude the newline, I'd leave off the /s modifier, or be specific about what you want to match by saying e.g. [^\n]* or \N*.
In reply to Re: Regex not matching closing newline?
by haukex
in thread Regex not matching closing newline?
by rverscho
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |