正規表現とは?
以前の内容をごらんください。
環境
ruby1.8.6
irb
オプション
i:大文字小文字の区別をしない
$ irb
/ruby/ =~ "Ruby"
=> nil
/ruby/i =~ "Ruby"
=> 0
=> nil
/ruby/i =~ "Ruby"
=> 0
o:一番最初に正規表現の評価が行われた時に一度だけ式展開され、同じ正規表現オブジェクトを返すようになります。
これは、ちょっと難しいです。
$ irb
#流れ的にaだけが展開されてbcは無視されるんじゃぁないの?と言った感じですが、違います。
a=["a","b","c"]
a.each do |x|
if /\w/o =~ x
puts x
end
end
=> a
b
c
a.each do |x|
if /\w/o =~ x
puts x
end
end
=> a
b
c
#流れ的にaだけが展開されてbcは無視されるんじゃぁないの?と言った感じですが、違います。
a=["a","b","c"]
a.each do |x|
if /#{x}/ =~ x
puts x
end
end
=> a
a.each do |x|
if /#{x}/ =~ x
puts x
end
end
=> a
これだとaのみ展開されます。
つまり、「一番最初に正規表現の評価が行われた時に一度だけ式展開され」これは、
//この正規表現を書く場所が一度展開されたら変わらないということです。
上記の1つ目は、\wという正規表現で変わらないため、全て表示されました。
一方2つ目は、a,b,cというように正規表現が変わろうとしたが、
oオプションにより最初のaしか式を展開しないため、
if /a/ =~ a
if /a/ =~ b
if /a/ =~ c
if /a/ =~ b
if /a/ =~ c
と言った具合に式が展開されたという事です。
これがオプションoです。
ほとんど使う事はないと思いますけどね。
x:正規表現中の空白や改行、コメントアウトを無視します。
$ irb
/foo # コメント
bar/x
bar/x
これは/foobar/と同じ意味の正規表現です。
m:.が改行にもマッチする様になります。
$ irb
/a.c/ =~ "a\nc"
=> nil
/a.c/m =~ "a\nc"
=> 0
=> nil
/a.c/m =~ "a\nc"
=> 0
※ちなみに返ってくる値が0なのはindex0の場所がマッチしているという事です。
%r:/を勝手にエスケープしれくれます。
$ irb
%r|a/b/c|
=> /a\/b\/c/
=> /a\/b\/c/
$&:マッチした値を取り出します。
$`:マッチした前の値を取り出します。
$':マッチした後の値を取り出します。
$ irb
/b/ =~ "aabcc"
$&
=> "b"
$`
=%gt; "cc"
$'
=> "aa"
$&
=> "b"
$`
=%gt; "cc"
$'
=> "aa"