せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】正規表現

とうとう、読み始めました。

プログラミング言語 Ruby

プログラミング言語 Ruby


 
ここまでの言語の勉強経緯
パーフェクトRuby⇒初めてのRuby⇒パーフェクトJavaプログラミング言語Ruby

1章のコードがやば美しい

やばいよ!
若干20ページ目にしてこのコード・・・。
早速自分でも書いてみて学ぶぞ、と思ったら、そもそも
正規表現をあんまり使いこなせてない


  
ということで、
正規表現の勉強をしていた。
このサイトがすごく良かったよ!

Ruby 正規表現入門ドリルEngineer Flies - エンジニアは空を飛ぶ

以下、気付いたことなど。

記号^ の扱い

「^」は、文字クラス(ブラケットで囲まれた範囲)で使う場合は否定。
それ以外は先頭。

なるほど。
 
 

正規表現の情報をグローバル変数$で取得する

後方参照の情報も$~で取得できる

グループ(詳細下記)を使用している場合、
MatchDataオブジェクト情報に 当該グループにマッチした情報が保存される。
 

"ab@example.com " =~ /(\w+)@(\w+).com/
p [$`, $&, $', $~]

⇒ ["", "ab@example.com", " ", #<MatchData "ab@example.com" 1:"ab" 2:"example">]

 
 

欲張り・無欲 一致

orig_str = "<b>aaa</b> and <b>bbb</b>"
p orig_str.gsub(/<b>(.*)<\/b>/, '<em>\1</em>')
p   [$`, $&, $', $~]
p orig_str.gsub(/<b>(.*?)<\/b>/, '<em>\1</em>')
p   [$`, $&, $', $~]

■実行結果

"<em>aaa</b> and <b>bbb</em>"
["", "<b>aaa</b> and <b>bbb</b>", "", #<MatchData "<b>aaa</b> and <b>bbb</b>" 1:"aaa</b> and <b>bbb">]
"<em>aaa</em> and <em>bbb</em>"
["<b>aaa</b> and ", "<b>bbb</b>", "", #<MatchData "<b>bbb</b>" 1:"bbb">]


 

グループ

()で括る。
当てはまる箇所が 正規表現に置き換わってしまう。

p "abbcbcc".scan /(b)+/  #<= [["b"], ["b"]]
p "abbcbcc".scan /b+/  #<= [["bb"], ["b"]]

イメージとしては、正規表現自体のキャプチャ、ということか。

p "abbcbcc".gsub(/b+/, "b")   #<= "abcbcc"

みたいな。
 

p /(a|b)+c/ =~ "sbabc"
p [$`, $&, $', $~]
p "sbabc".scan(/(a|b)+c/)

■実行結果

1
["s", "babc", "", #<MatchData "babc" 1:"b">]
[["b"]]

 

検索結果を記憶しない

 

p  /(foo)\s(bar)\s(?=baz)/.match "foo bar baz"
 ⇒ #<MatchData "foo bar " 1:"foo" 2:"bar">

ふむ、、