次節に大雑把な解説は記しましたが、
詳しくはこういった資料を読んで下さい)
(以下の各行を入力して確認しましょう)
#
以降はコメントなので入れなくていい
"abc"
"abc".class # 他に 'abc' %!abc! なども
/abc/
/abc/.class # 他に %r!abc! など
"abc" == "abc"
"abc" == /abc/
"abc" =~ /abc/ # String#=~
/abc/ =~ "abc" # RegExp#=~
s = "abc"
s =~ /a/
s =~ /b/
s =~ /.a/ # aの左に文字はない
s =~ /.b/ # . は a にマッチ
s =~ /./
s =~ /.../
s =~ /..../
文字列 =~ 正規表現 という使い方(反対の使い方も可)
正規表現による並びを「パターン」と呼ぶこともある
パターンマッチをさせる標準的な方法が =~ 演算子
文字 ~ は チルダ(tilde)と読む
右図のように、順々に一文字ずつ対応関係をとろうと試みる、のがマッチングの基本的な動作である。
"abcde" =~ /bc/ # もしくは
/bc/ =~ "abcde" # => 文字列の何文字目からの部分とマッチしたか を数値で返す
# マッチしないときは nil
# (「偽」を意味する値でもある)
文字列の中に、正規表現にマッチする部分並びがあるかどうかを検査するのが主な動作
'abc'=~/b/
だと先頭から(最初を0として)1文字目にマッチするので、整数1
がこの演算子式の値となる。特に指示がなければ、1文字 対 1文字 でマッチを試みる
正規表現の側には「文字クラス」による表現があり、 文字クラスに属するいずれかの文字とのマッチを試みる
"abcde" =~ /a...e/
"abcde" =~ /ab[cde]/
文字(または文字クラス)の後ろに限量子(量指定子とも呼ぶ)をつけることができ、 このときは複数の文字クラスから成るパターンとマッチする可能性がある
"abcde" =~ /a.*e/
*
が限量子の代表的なもので、直前におかれた記号(上の例では
‘.’)の数を指定する(*
の場合は、0個以上いくつでも、という指定になる)。?
、+
といった限量子(右図)もよく使われる。 先頭の ^
末尾の $
など、マッチングの場所を限定する記号(アンカー)がある
"abcde" =~ /^b/ # => nil (マッチしない)
正規表現の中で ()
で囲まれた部分は「キャプチャ」され、後方参照の対象となる。
/
などの特殊文字を含むパターンを指定するときは、%記法を使うと楽
{}
、()
のように対向する文字は対向して使う)
””
’’
//
などで囲むとき、 その囲みに使う文字そのものを
対象となる文字列の中に含めたいとき、単純に書くと、プログラムに混乱が生じるコンピュータやネットワークでは、¥ は \ と同じ文字として扱われる
(OSや国の設定により表示される形が違うだだけ)
"proxy:3128" =~ /(\S+):(\d+)/ and ( host,port = $1, $2 )
# ただし、この例は
host,port = "proxy:3128".split(':') # と書いても動作する
"http://www2.nagano.ac.jp/hiraoka/NP" =~ %r!\S+://(\S+)(/.*)! and
(domain, pathname = $1, $2)
# 実際はこれは正しく動かないので
# パターンをこう書く必要がある %r!\S+://(\S+?)(/.*)!
# (ここではは最短マッチのため +? という限量子を使った)
+
を使った場合と +?
を使った場合では結果が変わってくる。
+
は
greedy(貪欲)なマッチを行おうとする(なるべく長い列とのマッチを試みる)+?
は 控えめなマッチを行う限量子であるため、左側の /
の直前までマッチする / \S+? /
でなく%r! [^/]+ !
と
する方法も考えられる。上記の例では 式1 and 式2
という、and演算子による制御構造を使っている。
これは
if 式1 then 式2 end
または
式2 if 式1
という書き方をしても同じ意味になる(右図)。
また、and の直後で改行していることにも着目されたい。
上記の例では、多重代入を用いて
2つの変数に一度に値を代入している。