[解決済み】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> :)
どなたか、もっと屁理屈のない方法をご存知ですか?
編集する これ は重複していますが、私のものより見つけにくいので、削除はしていません。
提案されているのは
[^]
を"multiline dot"と呼びます。私がまだ理解していないのは、なぜ
[.\n]
は動作しません。これがJavaScriptの悲しいところなのでしょうか...。
解決方法は?
[.\n]
が機能しないのは
.
の内部では特別な意味を持ちません。
[]
を意味し、それは単にリテラルな
.
.
(.|\n)
は、「改行を含む任意の文字」を指定する方法です。もしすべての改行文字にマッチさせたい場合は、その前に
\r
のように、WindowsやMac OSのような改行コードを含むことができます。
(.|[\r\n])
.
これは、遅いだけでなく、やや面倒であることが判明しています(参照)
詳しくはKrisWebDevの回答
) で、より良い方法は、すべての空白文字と空白でない文字にマッチするように
[\s\S]
というようにすれば、すべてにマッチし、より速く、よりシンプルになります。
一般に、正規表現を使って実際のHTMLタグにマッチさせようとしてはいけません。例えば、以下を参照してください。 これら 質問 をご覧ください。
その代わりに、必要なタグを実際に DOM で検索してみましょう (jQuery を使用すると簡単ですが、いつでもこの方法を実行できます)。
document.getElementsByTagName("pre")
を標準の DOM で使用します)、そしてその結果のテキストコンテンツに対してマッチングが必要な場合は正規表現で検索します。
関連
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]