在头部后插入
我们有一个包含 HTML 文档的字符串。
编写一个正则表达式,它在<body>
标签后立即插入<h1>Hello</h1>
。该标签可能具有属性。
例如
let regexp = /your regular expression/;
let str = `
<html>
<body style="height: 200px">
...
</body>
</html>
`;
str = str.replace(regexp, `<h1>Hello</h1>`);
之后str
的值应该是
<html>
<body style="height: 200px"><h1>Hello</h1>
...
</body>
</html>
为了在<body>
标签后插入,我们必须先找到它。我们可以使用正则表达式模式<body.*?>
来实现。
在这个任务中,我们不需要修改 `<body>` 标签。我们只需要在它之后添加文本。
以下是我们的操作方法。
let str = '...<body style="...">...';
str = str.replace(/<body.*?>/, '$&<h1>Hello</h1>');
alert(str); // ...<body style="..."><h1>Hello</h1>...
在替换字符串中,`$&` 代表匹配本身,也就是源文本中对应于 `<body.*?>
的部分。它会被自身加上 `<h1>Hello</h1>` 替换。
另一种方法是使用后顾。
let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*?>)/, `<h1>Hello</h1>`);
alert(str); // ...<body style="..."><h1>Hello</h1>...
如你所见,这个正则表达式中只有后顾部分。
它的工作原理如下:
- 在文本中的每个位置。
- 检查它是否被 `
<body.*?>
前置。 - 如果是,那么我们就有了匹配。
标签 `<body.*?>
不会被返回。这个正则表达式的结果实际上是一个空字符串,但它只匹配被 `<body.*?>
前置的位置。
因此,它用 `<h1>Hello</h1>` 替换了被 `<body.*?>
前置的“空行”。这就是在 `<body>` 之后插入的方式。
附注:正则表达式标志,例如 `s
和 `i
也很有用:`/<body.*?>/si
。`s
标志使点 `.
匹配换行符,`i
标志使 `<body>
也匹配 `<BODY>
,不区分大小写。