複数行にマッチさせる正規表現

Pocket

JavaScriptで複数行にマッチさせる方法が分かりません。

やむを得ず次のように改行を「@」などの文字に変換してからマッチさせていました。

moto=moto.replace(/\n/g,"@");
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ではうまくいきません。

[ 2012年7月28日 | カテゴリー: JavaScript | タグ: ]

« | »

コメント

  1. arturotak より:

    これは、すばらしい情報です!
    この情報にどれくらい助けられたことか。
    どうもありがとうございました。

  2. stabucky より:

    >arturotakさん
    お役に立てて嬉しいです。
    正規表現は便利ですが難しいですね。

  3. 名乗る程のものでは(ry より:

    今まで悩まされていた任意の複数行を飛ばして抽出する方法が分かってとても勉強になりました。しかし、こんなにも簡単な方法だったとは思いもしませんでした。感謝感激!

  4. stabucky より:

    >名乗る程のものでは(ryさん
    お役に立てて嬉しいです。
    正規表現はまだまだ分からないことが多いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報