正規表現の最短マッチの存在を知らなかった。
とあるhtmlから特定のdivタグを正規表現でマッチさせたいときとかは、最短マッチが便利ということを知った。
一部ミスしてるけどあえて原文のままコピペ(#がついてるのは後で加えたコメント)
irb(main):001:0> s = <div id="foo">foo</div><div id="bar">bar</div> irb(main):002:0* ^C # エスケープ忘れた… *irb(main):002:0> s = "<div id=\"foo\">foo</div><div id=\"bar\">bar</div>" => "<div id=\"foo\">foo</div><div id=\"bar\">bar</div>" irb(main):003:0> s.scan(/<div id="foo">.*</div>/) irb(main):004:1/ ^C # またエスケープ忘れた… irb(main):004:0> s.scan(/<div id=\"foo\">.*<\/div>/) => ["<div id=\"foo\">foo</div><div id=\"bar\">bar</div>"] # 正規表現は基本的に最長マッチするので、このようになってしまう。 *irb(main):005:0> s.scan(/<div id=\"foo\">.*?<\/div>/) => ["<div id=\"foo\">foo</div>"] # .*を.*?とすることで最短マッチするようになる。 irb(main):006:0>
一部タイピングミスというかダブルクォートとかのエスケープ忘れがあるのはご愛嬌…
所詮まだまだその程度だということだ…。ああ、あとさらに改行とか間に入ってる場合は
*irb(main):008:0> s = "<div id=\"foo\">foo\n</div><div id=\"bar\">bar</div>" => "<div id=\"foo\">foo\n</div><div id=\"bar\">bar</div>" irb(main):009:0> s.scan(/<div id=\"foo\">.*?<\/div>/) => [] # これだと.が改行にマッチしないので駄目。 *irb(main):010:0> s.scan(/<div id=\"foo\">.*?<\/div>/m) => ["<div id=\"foo\">foo\n</div>"] # 正規表現の最後にmをつけることで.が改行にもマッチする(複数行モード)
となる。って全部ドキュメントに書いてあるのでちゃんと読めよ自分という話orz
正規表現って大学時代から存在知ってる気がするけど未だにちゃんと書けないんだよな…。