JavaScriptで複数行にマッチさせる方法が分かりません。
やむを得ず次のように改行を「@」などの文字に変換してからマッチさせていました。
moto=moto.replace(/\n/g,"@");
saki=moto.match(/.*/);
saki=moto.match(/.*/);
これだと文字列に元々「@」が含まれているとアウトです。
「.*」だと複数行にマッチしないのは「.」が「改行を除く任意の1文字」を表すためです。
そこで次のようにします。
saki=moto.match(/(\n|.)*/);
「改行」または「改行を除く任意の1文字」となってマッチします(「\r」を含める場合もあるかもしれません)。
このように悩んでいたのですが、スマートな解決策がありました。それもマイクロソフトのサイトに。
「.」
‘\n’を除く任意の1文字に一致します。’\n’を含めて任意の文字と一致させるには、'[\s\S]’などのパターンを指定します。
よく見ているページなのに見落としていました。
つまり次のようにすればよいのです。
saki=moto.match(/[\s\S]*/);
マイクロソフトの説明は次の通りです。
「\s」
空白、タブ、フォーム フィードなどの任意の空白文字と一致します。[ \f\n\r\t\v]と同じ意味です。
「\S」
空白文字以外の任意の文字と一致します。[^ \f\n\r\t\v]と同じ意味です。
「\s」が改行文字などを含む空白文字、「\S」が「\s」以外の任意の文字というわけですから、両方を使えば「改行を含む任意の1文字」となります。
なお、本件に関して、フラグに「m」を使う方法はJavaScriptではうまくいきません。
コメント
これは、すばらしい情報です!
この情報にどれくらい助けられたことか。
どうもありがとうございました。
>arturotakさん
お役に立てて嬉しいです。
正規表現は便利ですが難しいですね。
今まで悩まされていた任意の複数行を飛ばして抽出する方法が分かってとても勉強になりました。しかし、こんなにも簡単な方法だったとは思いもしませんでした。感謝感激!
>名乗る程のものでは(ryさん
お役に立てて嬉しいです。
正規表現はまだまだ分からないことが多いです。