Ограничение количества символов {,}, как оно работает?
Думал, что разобрался в регулярках, но оказывается нет.
У меня есть строки-шаблоны, которые известны зарание и нужно выбрать все между ними, но не учитывая переноса строк, если таковые будут. var str = ':::aaa:::\n\ntext\ntext\n\n:::sss:::'; Выше итоговая строка, а ниже зарание известные "теги". Цитата:
Цитата:
var re = /:::aaa:::\n{0,}([\s\S]+)\n{0,}:::sss:::/ Думал, что хватит и кода выше, но вот именно из-за него и задал вопрос.. Второе \n{0,} не работает, как хотелось бы. Я понимаю, что назад смотрящих нет, но ведь я и не ищу то, что позади, я делаю акцент на том, что впереди. Но запись \n{0,} оставляет оба переноса, если написать \n{1,}, то из результата убирается один перенос строки и т.д. И от сюда первый вопрос - почему запись \n{0,} , которая звучит, как "разрыв строки, повторяющийся ноль и более раз", звучит, как "включить в результат ноль разрывов строки", а запись \n{1,}, как "включить в результат вычислений один разрыв строки"... Почему так? И второй, как сделать, чтобы работало?) |
Потому что [\s\S]+ - жадный, и забирает всё, что попадает под него, для второго \n{0,} ничего не остаётся(т.к. \n входит в \s). Тут либо сделать нежадным: [\s\S]+? , или задать иной диапазон.
P.S. \n{0,} - это \n*, \n{1,} - это \n+ . |
Спасибо! Кажется понял, как устроена эта жадность.
|
Часовой пояс GMT +3, время: 04:48. |