Есть ли ленивые регулярные выражения в JS

137
11 июля 2019, 14:40

Есть два блока, идущих друг за другом:

[BLOCK]12345[/BLOCK][BLOCK]543]21[/BLOCK]

Как мне регулярным выражением вытащить их по-очереди, чтобы перебрать в цикле? Такой вариант не работает, ищется весь текст целиком:

/(\[BLOCK\].+\[\/BLOCK\])+?/mi
Answer 1

Метод .exec при использовании флага g сохраняет позицию найденного совпадения в объекте регулярного выражения и при следующем запуске начинает с нее, а не с начала строки.

Так же стоит поправить само выражение добавив ? после + - это позволит остановиться при первом появлении [/BLOCK], а так же, если нужен текст внутри то стоит группировать именно его, без самих тегов, в итоге регулярное выражение может принять вид:

 /\[BLOCK\](.+?)\[\/BLOCK\]/mig

Результатом .exec является массив, в котором нулевой элемент - совпавшая подстрока, а последующие элементы соответствуют группировкам.

В случае, если совпадение не найдено будет возвращен null

Пример:

var str = '[BLOCK]12345[/BLOCK][BLOCK]543]21[/BLOCK]'; 
 
var reg = /\[BLOCK\](.+?)\[\/BLOCK\]/mig; 
 
for (var res = reg.exec(str); res; res = reg.exec(str)) { 
  console.log(`match: '${res[0]}', text: '${res[1]}'`); 
}

Answer 2

Ленивый режим работы квантификаторов – противоположность жадному, он означает «повторять минимальное количество раз».

Его можно включить, если поставить знак вопроса '?' после квантификатора, так что он станет таким: *? или +? или даже ?? для '?'.

Чтобы не возникло путаницы – важно понимать: обычно ? сам является квантификатором (ноль или один). Но если он стоит после другого квантификатора (или даже после себя), то обретает другой смысл – в этом случае он меняет режим его работы на ленивый.

https://learn.javascript.ru/regexp-greedy-and-lazy

READ ALSO
collapse для html

collapse для html

Есть html-страница, сохраненная из браузераНа ней используется collapse(аккордеон)

156
include кусков html кода в файл index.html

include кусков html кода в файл index.html

В репозитории responsive-components есть файл indexhtml, в котором с помощью конструкций:

143
Выполнить редирект при наличии ссылки

Выполнить редирект при наличии ссылки

На странице вывода статей может появляться следующий код, с классом redirectTextКак автоматически на php выполнить редирект на ссылку, если она...

147