Это означает
. # match any character except newlines
* # zero or more times
? # matching as few characters as possible
Таким образом, в
<tag> text </tag> more text <tag> even more text </tag>
регулярное выражение <tag>(.*)</tag>
будет соответствовать всей строке сразу, захватывая
text </tag> more text <tag> even more text
в обратной ссылкечисло 1.
Если вы сопоставите это с <tag>(.*?)</tag>
, вы получите два совпадения:
<tag> text </tag>
<tag> even more text </tag>
только с text
и even more text
, захваченными в обратной ссылке № 1, соответственно.
И если (спасибо Коби!), Ваш исходный текст будет
<tag> text <tag> nested text </tag> back to first level </tag>
тогда вы обнаружите, что <tag>(.*)</tag>
снова соответствует всей строке, но <tag>(.*?)</tag>
будет соответствовать
<tag> text <tag> nested text </tag>
, потому что механизм регулярных выражений работает слева направо.Это одна из причин, по которой регулярные выражения являются «не лучшим инструментом» для сопоставления контекстно-свободных грамматик.