Each case is different:
.*([a-m\/]*).*
The first .* will probably match the whole string, because [a-m/] is not required to be present, and the first * is greedy and comes first.
.*([a-m\/]+).*
The first .* will match the whole string up to the last character that matches [a-m/] since only one is required, and the first * is greedy and comes first.
.*?([a-m\/]*).*
The first .*? will match the string up to the FIRST character that matches [a-m/], because *? is not greedy, then [a-m/]* will match all it can, because * is greedy, and then the last .* will match the rest of the string.