[ruby-list:130] TUTORIAL - regular expression

From: matz@... (Yukihiro Matsumoto)
Date: 1996-02-07 03:32:11 UTC
List: ruby-list #130
チュートリアルの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

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

In This Thread

Prev Next