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