まずは結論。
"."の代わりに"[\s\S]"を使いましょう

↓こうしたいところですが、
// 注意!動きません!
var matches = html.match(/<form.*?<\/form>/s);

↓こうしましょう。
var matches = html.match(/<form[\s\S]*?<\/form>/);



複数行にマッチさせたい場合、Perl等の正規表現では、「s修飾子」を使ってマッチさせます。
例えば、ワタクシメはPHP使いなのでPHP的に書くと、
$html = file_get_contents('http://example.com/');
preg_match('/<form id="form1".*?>(.*?)</form>/s', $html, $matches);

というように、HTMLをパースするときなどに使えます。

んがっ、JavaScriptの正規表現にはs修飾子が無いと言うのです。

RegExp - JavaScript | MDN によると、修飾子(flag) には g i m y があるのですが、Perlでドットを改行文字にマッチさせる s 修飾子というものがないので、どうしようもありません。


記事にも書かれていますが、リファレンスに書いてありました。

改行文字(\n、\r、 \u2028、あるいは、\u2029)を除いたあらゆる 1 文字にマッチします( [\s\S] という正規表現を使えば、改行文字を含めたあらゆる文字にマッチさせることができます)。
JavaScript Reference


またしても、マニュアル嫁ってヤツかぁ〜(T_T)