JavaScript的正则表达式多行标志不起作用

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

这是我的模式,我想获得在h1标签的文字。

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

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

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

您正在查找/.../s修饰符,也称为dotall修饰符。 它迫使点. 也匹配换行符,这是默认情况下不会执行的。

坏消息是它不存在于Javascript中。 好消息是你可以通过使用一个字符类(例如\s )和它的否定( \S )来解决它,就像这样:

 [\s\S] 

所以在你的情况下,正则表达式将变成:

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

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

dotall修饰符可能会很快将其转换为JavaScript。
https://github.com/tc39/proposal-regexp-dotall-flag

也许在ECMAScript 2018中,看到它在TC39过程的第三阶段。