Что такое жадный/нежадный в регулярках?

(.*) - 0 или больше
(.*?) - 0 или больше нежадный
(.+) - 1 или больше
(.+?) - 1 или больше нежадный
{3,5} - от 3 до 5
{3,5}? - от 3 до 5 нежадный
Когда пробовал удалять что-то ну например:
/<p>(.*?)<\/p>/
То субъективно жадный, нежадный одинаково работают. Посмотрел тут нежадный шаблон всегда "до последнего" что ли идёт? Можете разницу между ними объяснить небольшой пример было бы супер...

Ещё вопрос чем отличаются:
<div>.*?</div>
// и со скобками
<div>(.*?)</div>
  • Вопрос задан
  • 4931 просмотр
Решения вопроса 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Жадный - максимально возможная подстрока
Нежадный - минимально возможная подстрока
Для строки 'ababa' жадный вариант /a(.*)a/ даст 'bab', а нежадный /a(.*?)a/ даст 'b'.
А лучше почитайте хотя бы самый минимум, например на википедии.
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Жадные отхватывают как можно больше, нежадные, соответственно, как можно меньше.
регулярка /<p>.*<\/p>/ в тексте из нескольких абзацев выберет все от первого открывающего p до самого последнего закрывающего. Если инвертировать жадность /<p>.*<\/p>/U, то выбор будет до первого попавшегося закрывающего p

Скобки используются, чтобы получить в результате отдельную часть выражения (или несколько). Чтобы понять, просто сделайте var_dump результатов со скобками и без.
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Нежадный - находит минимальную строку удовлетворяющую условию.
Жадный - максимальную.
Со скобками - это часть строки которая сматчится в результаты.
Например нужно все содержимое ссылки
исходная строка: <a href="https://toster.ru"> 
регулярка href="([^"]+)"

советую сайт https://regex101.com/ , там можно удобно играться
Ответ написан
Комментировать
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
1. По умолчанию поиск с помощью RegExp производится с максимальным количеством символов, соответствующих шаблону. Применение ? позволяет перевести поиск в режим соответствия минимального количества символов.

«Жадный»
console.log(/<p>.+<\/p>/.exec('<p>Раз</p><p>Два</p>'));
//<p>Раз</p><p>Два</p>
console.log(/<p>.*<\/p>/.exec('<p></p><p>Раз</p><p>Два</p>'));
//<p></p><p>Раз</p><p>Два</p>
console.log(/\d{3,5}/.exec('123456789'));
//12345

«Нежадный»
console.log(/<p>.+?<\/p>/.exec('<p>Раз</p><p>Два</p>'));
//<p>Раз</p>
console.log(/<p>.*?<\/p>/.exec('<p></p><p>Раз</p><p>Два</p>'));
//<p></p>
console.log(/\d{3,5}?/.exec('123456789'));
//123


2. Скобки нужны для создания групп, номера которых можно использовать как внутри шаблона, так и для замены в методе replace.

Заменяем повтор первого типа найденной кавычки
console.log('"O\'Reilly" Books'.replace(/(['"])(.+?)\1/, '«$2»'));
//«O'Reilly» Books

Используем найденное совпадение для группы и в шаблоне, и в подстановке
console.log('<p>Раз</p><p>Два</p>'.replace(/<(p)>(.+?)<\/\1>/, '<span>$2</span>'));
//<span>Раз</span><p>Два</p>

А вот так можно делать что угодно с полученными совпадениями
console.log('<p class="one">Раз</p><div class="two">Два</div>'.replace(
	/(<(\w+).*?>)(.+?)(<\/\2>)/g,
	function () {
		return arguments[1] + arguments[3].toUpperCase() + arguments[4];
	}
));
//<p class="one">РАЗ</p><div class="two">ДВА</div>


Методы match и exec возвращают в массиве (в случае успешного поиска) как общий результат, так и найденные группы.

Пример того, что возвращает match для последнего примера:
console.log('<p class="one">Раз</p><p class="two">Два</p>'.match(/(<(\w+).*?>)(.+?)(<\/\2>)/));
/*
[
	'<p class="one">Раз</p>',
	'<p class="one">',
	'p',
	'Раз',
	'</p>'
]
*/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы