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>'
]
*/