Hatena::ブログ(Diary)

すたら日記

2012年01月23日

【正規表現,JavaScript,PHP】改行のある文字列をキャプチャする

結論

PHP, JavaScript ともに下記でOKです。

[\s\S]*


例えば、下記の文章の『説明:』以降を抜き出したい場合。

説明:『あにゃまる探偵 キルミンずぅ』(あにゃまるたんてい キルミンずぅ)は、(改行)
日本のサテライト・ハルフィルムメーカーと(改行)
大韓民国のJM ANIMATIONにより(改行)
制作された日本のテレビアニメ。

PHPならば

$result = preg_match('/^説明:([\s\S]*)$/u', $text, $match);
echo $match[1];

JavaScriptならば

var result = text.match(/^説明:([\s\S]*)$/);
alert(result[1]);


解説

実験ページを用意しました。

http://www.usamimi.info/~sutara/sample/reg_js_php_01.php


([\s\S]*)

『\s』は空白文字です。『[\r\n\t ]』と同じです。

『\S』は空白文字以外の文字です。『[^\r\n\t ]』と同じです。

要するに、全部ってことですね。


【参考】JavaScriptで改行にもマッチする正規表現 - FFFF - 0x

http://os0x.g.hatena.ne.jp/os0x/20080213/1202900650

(この記事のおかげで本当に助かりました。m(_ _)m )


実験ページにあるとおり、下の二つでもOKです。

((?:\s|.)*)
((?:[\r\n]|.)*)

しかし、ちょっと分かりづらいです。

今回は、マッチするかどうかチェックするだけでなく、マッチした文字列を抜き出す(キャプチャ)ことを望んでいます。

そうなると、単に検索条件を指定する上でまとめたいだけ、サブパターンを作るためだけに『()』を使う場合、キャプチャされないように『(?: )』と記述する必要があります。

(?:サブパターン)

断然、1番目の方法が簡便です。


また、PHPならばPerlのフラグ(パターン修飾子とも)である『s』が使えます。

/^説明:(.*)$/su

s (PCRE_DOTALL)

この修飾子を設定すると、パターン中のドットメタ文字は 改行を含む全ての文字にマッチします。 これを設定しない場合は、改行にはマッチしません。 この修飾子は、Perl の /s 修飾子と同じです。 [^a] のような否定の文字クラスは、 この修飾子の設定によらず、常に改行文字にマッチします。

【引用】PHP: 正規表現パターンに使用可能な修飾子 - Manual

http://jp2.php.net/manual/ja/reference.pcre.pattern.modifiers.php

しかし試してみたところ、どうやらJavaScriptでは修飾子『s』を使うことができないようです。

ならば、PHP, JavaScript両方で使える『([\s\S]*)』だけを覚えるほうがお得です。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

Connection: close