regexp

正規表現の活用

1 はじめに

参考資料

次節に大雑把な解説は記しましたが、
詳しくはこういった資料を読んで下さい)

名称について

正規表現とは

2 概要:

1 irbで チェック

(以下の各行を入力して確認しましょう) #以降はコメントなので入れなくていい

"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 =~ /..../
マッチング
  1. 文字列 =~ 正規表現 という使い方(反対の使い方も可)
    文法

  2. 文字列の中に、正規表現にマッチする部分並びがあるかどうかを検査するのが主な動作 実例1

  3. 特に指示がなければ、1文字 対 1文字 でマッチを試みる 文字クラス

  4. 正規表現の側には「文字クラス」による表現があり、 文字クラスに属するいずれかの文字とのマッチを試みる

    "abcde" =~ /a...e/
    "abcde" =~ /ab[cde]/
    限量子
  5. 文字(または文字クラス)の後ろに限量子(量指定子とも呼ぶ)をつけることができ、 このときは複数の文字クラスから成るパターンとマッチする可能性がある

    "abcde" =~ /a.*e/
    限量子
  6. 先頭の ^ 末尾の $ など、マッチングの場所を限定する記号(アンカー)がある

    "abcde" =~ /^b/  # => nil (マッチしない)

    キャプチャ $0

  7. 正規表現の中で () で囲まれた部分は「キャプチャ」され、後方参照の対象となる。

  8. / などの特殊文字を含むパターンを指定するときは、%記法を使うと楽

補足1(エスケープ文字について)
補足2(バックスラッシュについて)
\
使用例
"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+?)(/.*)!  
 #    (ここではは最短マッチのため +? という限量子を使った)
補足3 (限量子の使い方について)
補足4 (rubyの文法について)
余談
「子」の字