в большинстве вкусов регулярного выражения, *?
производство - это не жадный повтор. Это означает, что производство .*?
сначала совпадает с пустой строкой, а затем, если это не удается, один символ и так далее, пока совпадение не завершится успешно. Напротив, жадное производство .*
сначала пытается сопоставить весь ввод, а затем, если это не удается, он пытается уменьшить один символ.
Эта концепция применима только к механизмам регулярного выражения, которые используют рекурсивный обратный поиск для соответствия неоднозначным выражениям. Теоретически они соответствуют точно таким же откликам, но, поскольку они сначала пробуют разные вещи, вероятно, что они будут намного быстрее, чем другие.
Это также может быть полезно, когда группы захвата (в рекурсивных и NAV-типах одинаково) используются для извлечения информации из соответствующего действия. Например, выражение, подобное
"(.*?)"
может использоваться для захвата цитируемой строки. Поскольку подгруппа не жадна, вы можете быть уверены, что кавычки не будут захвачены, а подгруппа содержит только желаемый контент.
Они ведут себя по-разному. – BoltClock
Кто бы это сказал, «в программировании иногда возникает проблема. Затем вы используете регулярное выражение для решения этой проблемы. Теперь у вас есть 2 проблемы».? – makdad
@phooze: Каждый. –