たのしいRuby 第14章 Regexpクラス
僕とRubyの相性は良さそうです。書いていて苦痛を感じないし、何よりVimとの相性が良い。VimScriptはPythonをモデルにしてるし、RubyもPythonがモデルだ。2言語同時に使っていてもあまり差異を感じないのが魅力。シェルスクリプトっぽい感じなのでLinuxユーザーに人気なのもうなずける。
そして、今日は苦手の正規表現・・・。苦手の文字列・・・tanaka、拡張正規表現は殆んど使いません・・・ふくろう本を開くと一気に眠気が・・・気が重いけど、第14章正規表現にレッツゴー。
マッチしたときの戻り値
p "ABC" =~ /[A-Z]/ #=> 0 p "ABC" =~ /[0-9]/ #=> nil p "ABC" !~ /[0-9]/ #=> true p "ABC" !~ /[A-Z]/ #=> false
- マッチしたらn文字目を返す
- マッチしなかったらnilを返す
- !~の時はtrue,falseを返す
Rubyの場合、0は真なので要注意。
\A,\Z 文字列の先頭、文字列の末尾
p "ABC\nDEF" =~ /^ABC/ #=> 0 p "ABC\nDEF" =~ /\AABC/ #=> 0 p "ABC\nDEF" =~ /^DEF/ #=> 4 p "ABC\nDEF" =~ /\ADEF/ #=> nil p "ABC\nDEF" =~ /ABC$/ #=> 0 p "ABC\nDEF" =~ /ABC\Z/ #=> nil p "ABC\nDEF" =~ /DEF$/ #=> 4 p "ABC\nDEF" =~ /DEF\Z/ #=> 4
- \A,\Z・・・知らなかった。"文字列"のマッチ。
- ^,$は"行"のマッチ
複数行の時、動作が違うので要注意。
xオプション 空白とコメントの無視
xオプションが便利。
p "ABC\nDEF" =~ / ABC # ABCのマッチ | DEF # DEFのマッチ /x
便利っすねぇ。
mオプション .の改行文字マッチ
p "ABC\nDEF" =~ /C.*F/ #=> nil p "ABC\nDEF" =~ /C.*F/m #=> 2
知らなかった。かなり有用。
後方参照
()の取り出しはPerlと同様に出来る。
p "ABC" =~ /(.)(.)(.)/ p $0 #=> "regexp.rb" p $1 #=> "A" p $2 #=> "B" p $3 #=> "C"
$0は全く無関係。スクリプト名が入ってる。(Perlも同様)
マッチした前後も取り出せる。
p "ABCDEFGHI" =~ /DEF/ p $` #=> "ABC" p $& #=> "DEF" p $' #=> "GHI"
これ以上の事は書いてないので、ふくろう本を参照せよと書いてある・・・。やはり、そこか・・・。
Firefoxが落ちた。
ぐはぁ。結構書いたのにぃぃ〜面倒なので、結果だけ。
s = " ABCDEFG " p s.sub(/\s+/, '') #=> "ABCDEFG " p s.gsub(/\s+/, '') #=> "ABCDEFG" p s =~ s/\s+// #=> regexp.rb:41: warning: useless use of + in void context s = "ABC DEF XYZ" p s.gsub(/\w+/, '<matched>\&</matched>') #=> "<matched>ABC</matched> <matched>DEF</matched> <matched>XYZ</matched>" tag = s.gsub(/\w+/) do |m| "<matched>" + m.downcase + "</matched>" end p tag #=> "<matched>abc</matched> <matched>def</matched> <matched>xyz</matched>" s.scan(/(\w)(\w)(\w)/) do |m| p m end #=> ["A", "B", "C"] #=> ["D", "E", "F"] #=> ["X", "Y", "Z"] s = "Paris in THE THE THE THE spring" p s.gsub(/\b(\w+) \s (?= \1\b )/x, '') #=> "Paris in THE spring"
(?=)について理解が足りない。ふくろう本と、らくだ本をやらないと・・・。
高度な正規表現のサンプルは
がお勧め。僕は1個目から挫折中(汗
暇を見つけてやりたいと思います。真面目に正規表現やったら1週間かかるな・・・。
練習問題
案外あっさり解けた。メールアドレスの正規表現は深いので追求しすぎない方がいい(汗