たのしいRuby 第14章 Regexpクラス

僕とRubyの相性は良さそうです。書いていて苦痛を感じないし、何よりVimとの相性が良い。VimScriptはPythonをモデルにしてるし、RubyPythonがモデルだ。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"

基本的な正規表現Perlと同様と考えていいらしい。

これ以上の事は書いてないので、ふくろう本を参照せよと書いてある・・・。やはり、そこか・・・。

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週間かかるな・・・。

練習問題

案外あっさり解けた。メールアドレスの正規表現は深いので追求しすぎない方がいい(汗