Ruby
チュートリアル: 正規表現

«チュートリアル: はじめの一歩 -.. Top チュートリアル: Thread»

# チュートリアル: 正規表現

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/'
nil

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

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

Last update on February 22, 2004 16:48

«チュートリアル: はじめの一歩 -.. Top チュートリアル: Thread»