- - 目次

正規表現


rubyでは正規表現というものが多用されます.正規表現というのは 文字列のパターンを表現するものです.あるルールにしたがった文 字列を探すときのルールを表現するものと考えてもよいでしょう. たとえば,「"FOO"で始まって"R"で終る文字列」というようなルー ルです.ちなみにこの「ルール」を表現する正規表現は以下のよう になります.

/^FOO.*R$/

rubyでは//に囲まれた部分が正規表現です. ^は「先頭」,$は末尾を意味し, .*は任意の文字の0個以上の並びを意味します.

では,正規表現のルールの書き方を説明しましょう.正規表現には 上で説明したような特別な意味を持つ文字がいくつかあります.ま ずこれをあげておきます.

[ ]
文字範囲指定.[a-z]はaからzまでのいずれか
\w
英数字.[0-9A-Za-z_]と同じ
\W
非英数字
\s
空白文字.[ \t\n\r\f]と同じ
\S
非空白文字
\d
数字.[0-9] と同じ
\D
非数字
\b
語境界文字(範囲指定外)
\B
非語境界文字
\b
後退(0x08)(範囲指定内)
*
直前の表現の0回以上の繰り返し
+
直前の表現の1回以上の繰り返し
{m,n}
直前の表現のm回からn回の繰り返し
?
直前の表現の0または1回の繰り返し
|
選択
( )
表現をまとめる
それ以外
その文字そのもの

たとえば,「^f[a-z]+」は「fからはじまるaからzまでの 文字の繰り返し」であり,"foobar"や"fool"などと一致します.こう いう役のある一致を正規表現(regular expression)と呼びます.正規表 現は文字列の検索の時に役に立つので,UNIXの世界ではいろいろと 使われています.代表的なのはgrepと呼ばれるプログラムです.よ くお世話になっている人もいるのではないでしょうか?

正規表現を身につけるために,ちょっとしたプログラムを使ってみ ましょう.以下のプログラムをregx.rbという名前でセーブして実行 してみます.


 st = "\033[7m"
 en = "\033[m"

 while TRUE
   print "str> "
   STDOUT.flush
   str = gets
   break if not str
   str.chop!
   print "pat> "
   STDOUT.flush
   re = gets
   break if not re
   re.chop!
   str.gsub! re, "#{st}\\&#{en}"
   print str, "\n"
 end
 print "\n"

これは最初に入力した文字列のうちで,次に入力した正規表現に一致 する部分を反転して表示するプログラムです.以下に実行例を示し ます.


str> foobar
pat> ^fo+
foobar
^^^
# 実際はfooの部分は反転している.

いろいろ試してみましょう.


str> abc012dbcd555
pat> \d
abc012dbcd555
   ~~~    ~~~

上の例で分かるようにこのプログラムは複数の一致箇所を検出でき るようになっています.


str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~

この例では正規表現「f.*z」はfoozで はなく,foozboozにマッチしていますね.これは正 規表現というものはより長い一致を選ぶようになっているからです.

正規表現ではとてもひとめでは意味の分からないようなパターンも書 くことができます.パズルとしては面白いかも知れません.あまり 凝りすぎると後でなにをやろうとしたのか分からなくなってしまう かもしれませんが.


str> Wed Feb  7 08:58:04 JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb  7 08:58:04 JST 1996
           ~~~~~~~~

rubyのプログラムの中では正規表現は`/'でくくって記述します. またいくつかのメソッドは文字列を正規表現に自動的に変換してく れます.


% ruby -le 'print "abcdef" =~ /d/' 
3
% ruby -le 'print "aaaaaa" =~ /d/'
FALSE (ruby 1.0 の場合)   false (ruby 1.1 の場合)

`=~'は正規表現の比較を行う演算子で,一致した時に一致した位置 を返します.

どのようなメソッドで正規表現を扱うことが出来るかはリファレン スマニュアルを参照してください.


- - 目次

matz@caelum.co.jp
Last modified: Wed Jan 28 12:16:41 JST 1998