Ruby正規表現(二)

2148 ワード

quoteメソッドを使用した正規表現
正規表現のすべてのメタ文字を変換したい場合があります.quoteメソッドは実現できます.quoteメソッドは、エスケープされた正規表現文字列を返し、newメソッドと組み合わせて新しい正規表現オブジェクトを生成します.
re1 = Regexp.new("abc*def")

re2 = Regexp.new(Regexp.quote("abc*def"))

p (re1 = ~ "abc*def")   #=>nil

p (re2 =~ "abc*def")    #=>0

正規表現のオプション
正規表現のオプションを設定する場合は、/.../を選択します.im,ここでiおよびmが正規表現のオプションである.
i英字大文字小文字のオプションは無視します.このオプションを設定すると、文字列のアルファベットが大文字でも小文字でも一致します.
x正規表現の空白文字と#の後ろの文字オプションは無視されます.このオプションを指定すると、#を使用して正規表現にコメントを書くことができます.
mこのオプションを指定すると、使用できます.改行文字が一致しました.
str = "ABC
DEF
GHI" P /DEF.GHI/ =~ str #=> nil p /DEF.GHI/ =~ str #=> 4

Regexp.Newメソッドの2番目のパラメータは、オプション定数を指定するために使用できます.パラメータが1つしか必要ない場合は、2番目のパラメータを指定したり、nilを直接指定したりしないことができます.
たとえば、/Rubyスクリプト/iという正規表現は、次のように書くことができます.
Regexp.new("Ruby  ", Regexp::IGNORECASE)

また、|複数のオプションを指定することもできます.このとき,/Rubyスクリプト/imという正規表現は次のようになる.
Regexp.new("Ruby  ", Regexp::IGNORECASE | Regexp::MULTILINE)

キャプチャ
文字が一致しているかどうかをチェックするほか、正規表現にはもう一つの一般的な機能があり、マッチングよりも重要な機能であるキャプチャ(後方参照)とも言える.
キャプチャとは,正規表現のマッチング部分からその一部を抽出することである.「$数値」という形式の変数により、正規表現に一致する()で囲まれた部分文字列を取得できます.
/(.)(.)(.)/ =~ "abc"
first = $1
second = $2
third = $3
p first   #=> "a"
p second  #=> "b"
p third   #=> "c"

マッチングを行うとき、マッチングするかどうか、何番目の文字にマッチングするかどうかなどの情報しか知りません.キャプチャを使用すると、どの部分が一致しているかを知ることができます.したがって,この機能により,文字列の解析を非常に容易に行うことができる.
()複数のパターンを1つにまとめるためにも用いられる.プログラム内の正規表現を変更する場合、()の数を変更すると、参照する部分のインデックスも変更され、不便になることがあります.この場合、(?:)を使用して、キャプチャを必要としないモードをフィルタできます.
/(.)(\d\d)+(.)/ =~ "123456"
p $1  #=>"1"
p $2  #=>"45"
p $3  #=>"6"
/(.)(?:\d\d)+(.)/ =~ "123456"
p $1 #=>"1"
p $2 #=>"6"

「$数値」という形式に加えて、一致結果を保存する変数には、一致部分の前の文字列、一致部分の後の文字列を表す$`、$&、$'があります.
/C./ =~ "ABCDEF"
p $`   #=>"AB"
p $&   #=>"CD"
p $'   #=>"EF"