From: matz@... (Yukihiro Matsumoto) Date: 1996-02-07T12:32:11+09:00 Subject: [ruby-list:130] TUTORIAL - regular expression チュートリアルの5回目です.今回のテーマは『正規表現』です. 実はrubyにバグがあったので,中で紹介されているregx.rbを実行 する時には以下のパッチを当ててください.もうすぐ0.96b(か,ま たは0.97)を出します. --- string.c~ Fri Feb 2 18:29:57 1996 +++ string.c Wed Feb 7 10:22:30 1996 @@ -702 +702 @@ - offset += STRLEN(repl); + offset = beg + STRLEN(repl); -- * 正規表現のパズル もうちょっとましなパズルをしよう.今度はある文字列の一部に文 字列(パターンと呼ぶ)が一致するかどうかを見ることにしてみよう. たとえば,パターン"abc"は文字列"abcdef"とマッチする. これだけだと,全然面白くないので,パターンに役のある文字を導 入しよう.以下が特別な役のある文字だ. ^ 行頭 $ 行末 . 任意の1文字 [ ] 文字範囲指定.[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 ~~~~~~~~ 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> "abcdef" =~ /def/ 3 ruby> "aaaa" =~ /d/ FALSE `=~'は正規表現の比較を行う演算子で,一致した時一致した位置を 返す.