JavaScript 正则表达式两个标签之间的多行文本

2022-08-30 00:16:22

我写了一个正则表达式来从HTML中提取字符串,但似乎多行标志不起作用。

这是我的模式,我想在标签中获取文本。h1

var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

我创建了一个字符串来测试它。当字符串包含“\n”时,结果始终为 null。如果我删除了所有“\n”,它给了我正确的结果,无论有无标志。/m

我的正则表达式有什么问题?


答案 1

您正在寻找修饰符,也称为 dotall 修饰符。它强制点也匹配换行符,默认情况下它不会这样做/.../s.

坏消息是它在JavaScript中不存在(截至ES2018,它确实存在,见下文)。好消息是,您可以通过同时使用字符类(例如 )及其否定()来解决此问题,如下所示:\s\S

[\s\S]

因此,在您的情况下,正则表达式将变为:

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

从ES2018开始,JavaScript支持(dotAll)标志,因此在现代环境中,您的正则表达式可以像您编写的那样,但在末尾有一个标志(而不是; 更改了方式和工作方式,而不是):ssmm^$.

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is

答案 2

你需要(dotall)修饰符,这在Javascript中显然不存在 - 你可以按照@molf的建议用[\s\S]替换。(多行)修饰符使 ^ 和 $ 匹配行,而不是整个字符串。s.m