おそらく、この回答は必要よりも少し遅れて到着しましたが、誰かが同じ問題に遭遇した場合に備えて、ここに残しておきます (この質問が行われてから 7 年、6 か月後)。
現在、後読みは ECMA2018 標準に含まれており、少なくとも Chrome の最新バージョンでサポートされています。ただし、それらの有無にかかわらずパズルを解く場合があります。
否定的な先読みによる解決策:
let testString = `html.htm app.htm foo.tm foo.htm bar.js 1to3.htm _.js _.htm`;
testString.match(/\b(?!foo)[\w-.]+\.htm\b/gi);
> (4) ["html.htm", "app.htm", "1to3.htm", "_.htm"]
否定後読みの解決策:
testString.match(/\b[\w-.]+(?<!foo)\.htm\b/gi);
> (4) ["html.htm", "app.htm", "1to3.htm", "_.htm"]
(技術的に)前向きな先読みによる解決策:
testString.match(/\b(?=[^f])[\w-.]+\.htm\b/gi);
> (4) ["html.htm", "app.htm", "1to3.htm", "_.htm"]
等
これらのすべての RegExp は、異なる方法で同じことを JS エンジンに伝えます。それらが JS エンジンに渡すメッセージは次のようなものです。
この文字列で、次のすべての文字シーケンスを見つけてください。
- 他のテキスト (単語など) から分離されています。
- 英語のアルファベット、アンダースコア、ハイフン、ドット、または数字の 1 つ以上の文字で構成されます。
- 「.htm」で終わります。
- それとは別に、「.htm」の前のシーケンスの部分は「foo」以外の何かである可能性があります。