昨日はふるぼっこにしすぎたので、反省で教えてやるかテスト

何かid:reposeにメッセで聞かれてたっぽいけど、俺寝てしまってた。たぶん、これについてだろう。

text="ghost in the shell"
if(text=~/(\s)(.*)(\s)/)
 p $2
end
==>in the

えーっと、inのみを取り出したかったんですが、おそらく、\sでthe shell区切りの半角スペースまでアレしたんでしょうね。
ああ、ここで+か?を使わなきゃいけないんじゃなかったっけ。うーん。あとでぐぐろう。

と思ったらすぐミツカタ

text="ghost in the shell"
if(text=~/(\s)(.*?)(\s)/)
 p $2
end
==>in

メカニズムワカラナスwwwwwwwwwwwwww

2007-12-04 - 糞ネット弁慶

メカニズムは俺もあんまし詳しくは説明できないのだけれど、超あばうとに説明すると(.*)ってのは欲張り演算子*1だとかそういう風な名前で呼ばれてた気がする。この前説明したところで言うとhtmlとかをparse*2するときに一番外側にマッチするのがこの表現。この場合、「in」、「the」とか「in the」とかいろいろあるわけだけど、一番外側にある「in the」にマッチしたってことだろう、たぶん。

で、今回の場合「in」にマッチしたいってことなので、これだとだめで。(.*)は最長だけど、(.*?)は最短のほうのマッチを持ってくる。だから「in」と「the」がマッチする、ということなのだけど、whileループとかで回してないから最初の「in」が出てきたっていうことなのだろう。

そういうことなので、whileとかを使って、この表現にマッチするもの全部を出力するコードをトラバで飛ばすってのが宿題ってことで、id:repose

ちなみに、説明に「だろう」とか「たぶん」が異様に多いのは僕に正規表現の知識がほとんどない中で説明しているからであります。まあ、その辺は勘弁。

*1:超不正確なことを言っている。最長一致とかだったっけ?

*2:正規表現とかで解析するとかそういう類?