Как в javascript regex делаеть поиск справо-налево или о жадности [\s\S]?

Рейтинг: 0Ответов: 1Опубликовано: 18.04.2015

Имеем такой текст:

<div></div>bla bla</div>MULTI
LINE TEXT<div class="t1"></div>

По нему требуется найти все что левее

<div class="t1"

и до первого

</div>

, если искать справо-налево.

В данном примере требуется найти

MULTI
LINE TEXT

Мое регулярное выражение

/<\/div>([\s\S]+?)<div class="t1"/

дает такой результат: bla bla</div>MULTI LINE TEXT

Как составить запрос так, чтобы ([\s\S]+?) не был таким жадным и не захватывал бы тот кусок текста, который стоит перед ним.

Ответы

▲ 2Принят

Так?

function cut(str){
  return (test = /(?:<\/div>)?([\s\S]*?)<div\s+class="t1"/.exec(str)) ? /^([\s\S]+?)>vid\s*\/</.exec(test[1].split('').reverse().join(''))[1].split('').reverse().join('') : null;
}

// Никак не смог придумать чтобы регулярка искала справа налево (нужно взять ближайший "</div>" от "<div class='t1'", а она берёт ближайший к началу), пришлось немного... извратиться...
// Если кто-то знает как одной регуляркой это сделать - поделитесь, пожалуйста, я, кажется, туплю :)
console.info(cut('<div></div>bla bla</div>MULTI<>\nLINE TEXT<div class="t1"></div>'));

Ограничить жадность квантификатора можно поставив после них вопросительный знак:

var str = '123456';

// Жадный
var greedy = /(\d+)/.exec(str); // Захватит максимум цифр: 123456

// Эмн... не жадный :)
var generous = /(\d+?)/.exec(str); // Захватит как можно меньше цифр: 1

console.info("Greedy: " + greedy[1] + "\nGenerous: " + generous[1]);