It means
. # match any character except newlines
* # zero or more times
? # matching as few characters as possible
So in
<tag> text </tag> more text <tag> even more text </tag>
the regex <tag>(.*)</tag>
will match the entire string at once, capturing
text </tag> more text <tag> even more text
in backreference number 1.
If you match that with <tag>(.*?)</tag>
instead, you'll get two matches:
<tag> text </tag>
<tag> even more text </tag>
with only text
and even more text
being captured in backreference number 1, respectively.
And if (thanks Kobi!) your source text is
<tag> text <tag> nested text </tag> back to first level </tag>
then you'll find out that <tag>(.*)</tag>
matches the whole string again, but <tag>(.*?)</tag>
will match
<tag> text <tag> nested text </tag>
because the regex engine works from left to right. This is one of the reasons regular expressions are "not the best tool" for matching context-free grammars.