ruby正規表現チュートリアル
3452 ワード
もっと面白いプログラムを見てみましょう今回は、単純モード符号化による記述と文字列が一致するかどうかをテストする.
これらのパターン(pattern)では、いくつかの文字や文字の組み合わせには、次のような独特の意味があります.
それらのモードで共通に使用される奇妙な語彙を正規表現と呼ぶ.Perlのようにルビーも二重引用符ではなく前スラッシュで囲まれています.正規表現を使ったことがない場合は、ルール以外に何もないように見えるかもしれませんが、少し時間をかけて理解するのは賢明です.文字列をパターンマッチングしたり、検索したり、他の操作をしたりする必要がある場合、その効率的な表現能力は頭痛を治すことができます(多くの行のコードを節約することができます).
例を挙げると、1つの文字列がこのような記述情報に合致するかどうかをテストしたいと考えられる.もしあなたがベテランのCプログラマーであれば、あなたの頭の中には数十行のプログラムがいっぱい入っているのではないでしょうか.認めてください.あなたは自分をコントロールすることができません.ルビーでは、文字列を正規表現/^f[A-Z](^[a-z])*$/でチェックすればいいだけです.
では、「<>で囲まれた16桁は?」大丈夫です.
最初は正規表現が頭が痛いように見えますが、すぐにこのように効率的にあなたの心の中の意味を表現することができて満足します.
次は正規表現を実験するのに役立つ小さなプログラムでregxとして保存します.rb、コマンドラインに「ruby regx」と入力します.rb′運転
このウィジェットは2回、1回の文字列、1回の正規表現を入力する必要がある.入力文字列は正規表現でチェックし、すべての一致部分を反視高輝度で表示する.細部にかかわらず、後でコード分析があります.
上の赤い部分はプログラム入力において反視で表示する.次の「~~~」行は、文字ベースのブラウザを使用する人を便利にするためです.
入力をいくつか試してみましょう.
str> abc012dbcd555
pat> \d
abc012dbcd555
驚いたら、このページの冒頭の表を見てください.dはアルファベットdとは関係なく、単一の数字に対応しています.
パターンに一致する方法が1つ以上あればどうなりますか?
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
foozboozがfoozだけでなく一致するのは、1つの正規表現子が最も長いサブ列にできるだけ一致するためである.
以下に、コロンで区切られた数値期間を文字列から分離するパターンマッチングを示す.
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
これらのパターン(pattern)では、いくつかの文字や文字の組み合わせには、次のような独特の意味があります.
[] ( ,[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のようにルビーも二重引用符ではなく前スラッシュで囲まれています.正規表現を使ったことがない場合は、ルール以外に何もないように見えるかもしれませんが、少し時間をかけて理解するのは賢明です.文字列をパターンマッチングしたり、検索したり、他の操作をしたりする必要がある場合、その効率的な表現能力は頭痛を治すことができます(多くの行のコードを節約することができます).
例を挙げると、1つの文字列がこのような記述情報に合致するかどうかをテストしたいと考えられる.もしあなたがベテランのCプログラマーであれば、あなたの頭の中には数十行のプログラムがいっぱい入っているのではないでしょうか.認めてください.あなたは自分をコントロールすることができません.ルビーでは、文字列を正規表現/^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
~~~
上の赤い部分はプログラム入力において反視で表示する.次の「~~~」行は、文字ベースのブラウザを使用する人を便利にするためです.
入力をいくつか試してみましょう.
str> abc012dbcd555
pat> \d
abc012dbcd555
驚いたら、このページの冒頭の表を見てください.dはアルファベットdとは関係なく、単一の数字に対応しています.
パターンに一致する方法が1つ以上あればどうなりますか?
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
foozboozがfoozだけでなく一致するのは、1つの正規表現子が最も長いサブ列にできるだけ一致するためである.
以下に、コロンで区切られた数値期間を文字列から分離するパターンマッチングを示す.
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