en.javascript.info/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md
Ilya Kantor 681cae4b6a regexp
2019-09-06 01:15:24 +03:00

2.1 KiB
Raw Permalink Blame History

Для того, чтобы вставить после тега <body>, нужно вначале его найти. Будем использовать регулярное выражение pattern:<body.*>.

Далее, нам нужно оставить сам тег <body> на месте и добавить текст после него.

Это можно сделать вот так:

let str = '...<body style="...">...';
str = str.replace(/<body.*>/, '$&<h1>Hello</h1>');

alert(str); // ...<body style="..."><h1>Hello</h1>...

В строке замены $& означает само совпадение, то есть мы заменяем pattern:<body.*> заменяется на самого себя плюс <h1>Hello</h1>.

Альтернативный вариант - использовать ретроспективную проверку:

let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*>)/, `<h1>Hello</h1>`);

alert(str); // ...<body style="..."><h1>Hello</h1>...

Такое регулярное выражение на каждой позиции будет проверять, не идёт ли прямо перед ней pattern:<body.*>. Если да - совпадение найдено. Но сам тег pattern:<body.*> в совпадение не входит, он только участвует в проверке. А других символов после проверки в нём нет, так что текст совпадения будет пустым.

Происходит замена "пустой строки", перед которой идёт pattern:<body.*> на <h1>Hello</h1>. Что, как раз, и есть вставка этой строки после <body>.

P.S. Этому регулярному выражению не помешают флаги: pattern:/<body.*>/si, чтобы в "точку" входил перевод строки (тег может занимать несколько строк), а также чтобы теги в другом регистре типа match:<BODY> тоже находились.