ルビー正規表現教程
もっと面白いプログラムを見ましょう。今回は文字列の有無と簡明なモードによってテストします。 これらのモードでは、一部の文字や文字の組み合わせには独特の意味があります。
[] ( ,[a - z] a z )
\w ; [0-9A-Za-z]
\W ,
\s [ \t
\r\f] ; [ \t
\r\f]
\S
\d [0-9] ; [0-9]
\D
\b (0x08) ( )
\b (word boundary) ( )
\B
* 0
+ 1
{m,n} m , n
? 1 ; {0,1}
|
() ( grouping)
これらのモードで共通に使われている奇妙な語彙は正則表現と呼ばれています。Perlのように、Rubyも前斜棒でそれらをくくります。もしあなたが以前正則表現を使ったことがないなら、規則以外は何もないように見えるかもしれませんが、少し時間をかけてそれらを理解するのが賢明です。文字列にマッチする必要があります。検索や他の操作では、頭の痛いのを治す効果的な表現力があります。たとえば、文字列がこのような記述情報に合っているかどうかをテストしたいです。たぶんあなたの頭の中にはすでに何十行かのプログラムが詰まっていますよね?认めましょう。自分をコントロールするのは难しいです。Rubyでは、あなたの文字列を正规表式/^f[A-Z](^[a-z])*/チェックすればいいです。では、「一つは<>で囲まれた16桁の数」は?大丈夫です。
ruby> def chab(s) # "contains hex in angle brackets"
| (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil
| end
nil
ruby> chab "Not this one."
false
ruby> chab "Maybe this? {0x35}" # wrong kind of brackets
false
ruby> chab "Or this? <0x38z7e>" # bogus hex digit
false
ruby> chab "Okay, this: <0xfc0004>."
true
、一見正則表現は頭が痛いです。でも、あなたはすぐにこのように効率的にあなたの心の中の意味を表現できて満足します。以下は正則表現を実験するための小さなプログラムです。これをregx.rbとして保存して、コマンドラインに'rubyを入力します。 regx.rb'を実行します。
# Requires an ANSI terminal!
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, "
"
end
print "
"
このウィジェットは2回入力して、1回の文字列、1回の正規表現を要求します。入力した文字列は正規表現で検査して、すべてのマッチ部分を逆視で高輝度で表示します。詳細にかかわらず、後でコード分析があります。
str> foobar
pat> ^fo+
foobar
~~~
の上の赤い部分はプログラム入力中にバックビューで表示されます。下の「~」行は文字ブラウザを利用する人を便利にするためです。もういくつかの入力を試してみます。 abc 012 dbcd 555 pat> \d abc 012 dbcd 555 驚いたら、このページの先頭の表を見てください。 \dはアルファベットdとは関係なく、単一の数字に対応しています。一つ以上の方法があれば、モードにマッチする方法はどうなりますか?str; foozbowzer pat> f.*z foozbook zer~~~~ foozbowzがマッチしているのはfoozだけではなく、正の表現ができるだけ最も長いサブストリングにマッチしているからです。下にはコロンで区切られた数字の時間帯を文字列から分離したパターンマッチングがあります。str> Wed Feb 7 08:58:04 JST 1996 pat> [0-9]+:[0-9]+(:[0-9]+)?Wed Feb 7 08:58:04 JST 1996 "=~"は、正規表現にマッチする演算子です。文字列で見つけたマッチの位置を返します。 nil 表示モードがマッチングできません。ruby> "abcdef" =~ /d/ 3 ruby> "aaaaaa" =~ /d/ nil