世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。
![Google](https://cdn-ak-scissors.b.st-hatena.com/image/square/0c7286c0f40f4a705952dd5fbd3ad6afbb7c5908/height=288;version=1;width=512/https%3A%2F%2Fwww.google.com%2Flogos%2Fdoodles%2F2024%2Fdragon-boat-festival-2024-6753651837110449-2xa.gif)
2012年05月01日21:34 Ruby 正規表現で最短マッチを知っとくとちょっと便利かも 正規表現ってあるじゃないですか。そうです。アレです。 とっても便利で、いろんな場面で役立つと思うんですが、ときどき最短マッチを使いたくなって「最短マッチってどう書くんだっけなぁ?」ってなってググることがあります(よね!) 通常は最長マッチになる 通常、正規表現内で * とか + とか付けると、直前の表現の0回/1回以上の繰り返しを表しますが、この書き方だとできるだけ長い要素にマッチしようとします。大事なことなのでもう一度言います。できるだけ長い要素にマッチしようとするんです。 大抵はそれで構わないんですが、ときどきそれでは困るケースがあります。例えばこんなケースを考えてみましょう(あんまり良い例が思いつかない)。 ・"名前(ニックネーム)"という形式 ・名前と(ニックネーム)の間には半角or全角ス
最短マッチの意味自体はそんなに難しくない。まず最初に通常(最短マッチでない)の場合の説明。 <title>cloned.log</title>という箇所に対して <.*>というパターンを書いてしまうと <title>cloned.log</title> の全てがパターンにマッチしているとみなされる。途中で>が一度出現しているけれど、最後に出てきた>までが「一つのパターン」としてみなされる。 何が困るかというと、例えば上記の場合だとタグだけを引っ掛けたいときに困る。要は、 <title>cloned.log</title> としたいとき。ここで登場するのが最短マッチ。ここの例で言えば、<から始まって最初に>が出てくるまでを「一つのパターン」としてみなしたい訳だ。答えから書くと、 <.*?>となる。?が最短マッチのメタ文字。 ここまでだとそんなに難しくない印象なので、応用して、<a name=
「.*」や「.+」を使うと、限りなく連続した文字を表します。 これは非常に便利なのですが、予想以上に長くマッチして、思ったように動かないことがあります。 これを解決するためには「?」を付加して最短一致するように仕向ける方法があります。 また、ここで説明する「?」は「直前の文字の0回または1回に一致」とは違います。 文字は同じですが、まったくの別物です。(記述する位置で見分けてください。) たとえば、HTMLのタグを消す場合、このように書いたとします。(Perlの置換文法) s/<.+>//g これでタグは消えるのですが、タグだけではなく、タグに挟まれた間の文字まで消してしまいます。(下線部分) <P>abc</P> 理由は最長一致モードで動作しているからです。 動作をみると、途中に「>」が出てきているのですが、そこでは止まらず、最後の「>」までマッチしていま
<html> <div></div> <div class="content"> <b>内容<b/><br /> <img src="#" /> <p>ほげほげほげほげ</p> </div> <div></div> </html> 上のようなHTMLがあるとします。<div>の前後にもhtmlは書かれています。 そこから正規表現で<div class="content">~~~</div>の中身を取り出したいのですが、できません。 言語はPHPで、 /<div class=\"content\">.*<\/div>/ と書いてみたんですが、改行などがありうまくいきませんでした。 どのようにに記述すればうまくいくんでしょうか。
久しぶりに mbstring モジュール(特にマルチバイト正規表現)のソースコードを眺めていたのですが、いくつか面白い(知らなかった)挙動がありましたでメモしておきます。 確認した PHP のバージョンは 5.4.10 ですが、PHP 5.0 以降であれば、あまり変わりません。 パターン修飾子 m と s の解釈 これまでは Perl 互換の正規表現と同じと思っていたのですが、マルチバイト正規表現のパターン修飾子 m と s は Perl 互換の正規表現(preg)と挙動が違います。 mb_ereg_replace() と preg_replace() で、改行を含む文字列置き換えの結果を比較すると以下のようになります。 パターン修飾子 s(マルチバイト正規表現:ONIG_OPTION_SINGLELINE, Perl互換正規表現:PCRE_DOTALL) $ php -r 'echo m
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く