1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの正規表現を複数行に渡って使用するには?

2022-03-27 14:04:30

質問

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> :)

どなたか、もっと屁理屈のない方法をご存知ですか?

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

提案されているのは [^] を"multiline dot"と呼びます。私がまだ理解していないのは、なぜ [.\n] は動作しません。これがJavaScriptの悲しいところなのでしょうか...。

解決方法は?

[.\n] が機能しないのは . の内部では特別な意味を持ちません。 [] を意味し、それは単にリテラルな . . (.|\n) は、「改行を含む任意の文字」を指定する方法です。もしすべての改行文字にマッチさせたい場合は、その前に \r のように、WindowsやMac OSのような改行コードを含むことができます。 (.|[\r\n]) .

これは、遅いだけでなく、やや面倒であることが判明しています(参照) 詳しくはKrisWebDevの回答 ) で、より良い方法は、すべての空白文字と空白でない文字にマッチするように [\s\S] というようにすれば、すべてにマッチし、より速く、よりシンプルになります。

一般に、正規表現を使って実際のHTMLタグにマッチさせようとしてはいけません。例えば、以下を参照してください。 これら 質問 をご覧ください。

その代わりに、必要なタグを実際に DOM で検索してみましょう (jQuery を使用すると簡単ですが、いつでもこの方法を実行できます)。 document.getElementsByTagName("pre") を標準の DOM で使用します)、そしてその結果のテキストコンテンツに対してマッチングが必要な場合は正規表現で検索します。