Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ограничение количества символов {,}, как оно работает? (https://javascript.ru/forum/misc/49583-ogranichenie-kolichestva-simvolov-%7B-%7D-kak-ono-rabotaet.html)

riva 19.08.2014 20:05

Ограничение количества символов {,}, как оно работает?
 
Думал, что разобрался в регулярках, но оказывается нет.
У меня есть строки-шаблоны, которые известны зарание и нужно выбрать все между ними, но не учитывая переноса строк, если таковые будут.
var str = ':::aaa:::\n\ntext\ntext\n\n:::sss:::';

Выше итоговая строка, а ниже зарание известные "теги".
Цитата:

:::aaa:::
:::sss:::
Выбрать нужно текст ниже.
Цитата:

text\ntext
Единственное, на что стоит обратить внимание, это перенос строки, которых может быть сколько угодно после открывающего тега и сколько угодно до закрывающего.
var re = /:::aaa:::\n{0,}([\s\S]+)\n{0,}:::sss:::/

Думал, что хватит и кода выше, но вот именно из-за него и задал вопрос..
Второе \n{0,} не работает, как хотелось бы. Я понимаю, что назад смотрящих нет, но ведь я и не ищу то, что позади, я делаю акцент на том, что впереди.
Но запись \n{0,} оставляет оба переноса, если написать \n{1,}, то из результата убирается один перенос строки и т.д.
И от сюда первый вопрос - почему запись \n{0,} , которая звучит, как "разрыв строки, повторяющийся ноль и более раз", звучит, как "включить в результат ноль разрывов строки", а запись \n{1,}, как "включить в результат вычислений один разрыв строки"... Почему так?
И второй, как сделать, чтобы работало?)

Aetae 19.08.2014 20:20

Потому что [\s\S]+ - жадный, и забирает всё, что попадает под него, для второго \n{0,} ничего не остаётся(т.к. \n входит в \s). Тут либо сделать нежадным: [\s\S]+? , или задать иной диапазон.

P.S. \n{0,} - это \n*, \n{1,} - это \n+ .

riva 19.08.2014 20:56

Спасибо! Кажется понял, как устроена эта жадность.


Часовой пояс GMT +3, время: 04:48.