複数行にわたる JavaScript 正規表現を使用するにはどうすればいいですか? 質問する

複数行にわたる JavaScript 正規表現を使用するにはどうすればいいですか? 質問する
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr);     // null

PRE ブロックが改行文字にまたがっていても、それを拾い上げたいです。'm' フラグがそれを実現すると思いましたが、実現しません。

答えを見つけたここ投稿する前に。私はJavaScriptを知っていると思っていたので(本を3冊読み、何時間も働いて)、SOには既存の解決策がなかったので、とにかく投稿することにしました。ここに石を投げてください

したがって、解決策は次のとおりです。

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr);     // <pre>...</pre> :)

もっと分かりやすい方法を持っている人はいますか?

編集:これ重複していますが、私のものよりも見つけにくいので削除しません。

これは[^]「複数行のドット」として提案されています。なぜ機能しないのか、いまだに理解できません[.\n]。これは JavaScript の残念な部分の一つだと思います。

ベストアンサー1

(.|[\r\n])複数行の一致にはの代わりにを使用しないでください.

複数行のマッチングには[\s\S]の代わりにを使用してください.

また、 orの代わりに*?or量指定子を使用して、必要のない貪欲さを避けてください。これはパフォーマンスに大きな影響を与える可能性があります。+?*+

私が作成したベンチマークをご覧ください:https://jsben.ch/R4Hxu

Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower

注意: 使用することもできます[^]が、以下のコメントでは非推奨となっています。

おすすめ記事