[ruby]コソコソ勉強

基礎が全然わかってないのを思い知ったので、rubyをまじめに勉強することにした。ので「たのしいruby」帰りに買ってきた。読み始め。

正規表現

表現の内容自体はほとんど他の言語といっしょ。最短マッチも *?, +?でおんなじ。あ、そか。なかの人はst.cだものね。

マッチング

p.259によると 「/正規表現/ =~ "文字列"」の順が正しいのかな? (脳内perl皮質から警報が出てる)

>> re = /some/
=> /some/
>> re.class
=> Regexp
>> str = "truely some string"
=> "truely some string"

>> str =~ re
=> 7
>> re =~ str
=> 7
>> re === str
=> true
>> str === re
=> false

逆でも良いのか。関係だからsymmetricなだけかな。よくわかんない。

quoteメソッド

メタ殺し。かえって面倒くさい。brainf*ck全開!みたいなもの扱わない限り、あんまり使わなさそう。

>> qt = Regexp.quote("abc*def")
=> "abc\\*def"
>> re = Regexp.new(qt)
=> /abc\*def/
>> re === "hogeabc*def"
=> true
オプション

定数は本当に3つだけなのか。なんで他は定義してないんだろう?

>> Regexp.constants
=> ["IGNORECASE", "MULTILINE", "EXTENDED"]

全部?

s,e,u,n sjis, euc, utf8, bytes
i IGNORECASE
x 正規表現中の空白およびコメントを無視
m MULTILINE
o EXTENDED (memoize)
後方参照

これも普通か。$1, $2,...に入ってる。正規表現上では \1, \2...。あとマッチ文字列と前後は $`, $&, $'。クォートとバッククォートってパッと見でわからないのでいやだな。そのためだけに Englishってのも嫌だし・・・
Englishの場合は $PREMATCH, $MATCH, $POSTMATCH。

>> def pick(re, st)
>>   p re === st
>>   puts $` +"[" + $& + "]" + $'
>> end
=> nil
>> pick(/wooley/, "whoisbehindthisstringiswooleyherebutyoumaynotnoticeme")
true
whoisbehindthisstringis[wooley]herebutyoumaynotnoticeme
=> nil