Skip to content

Instantly share code, notes, and snippets.

@pasberth
Created December 10, 2011 15:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pasberth/1455446 to your computer and use it in GitHub Desktop.
Save pasberth/1455446 to your computer and use it in GitHub Desktop.
Rubyだったらこんなに楽に正規表現を書けるよ!!
# -*- coding: utf-8 -*-
# Rubyだったら正規表現はすごい簡単だよ!!!
# 他の言語ではいくつかパターンがありますが、自分はRubyほど楽に正規表現を利用できる言語を知りません。
msg = "まなさん大好き"
# Ruby では正規表現リテラルがあります。
# // のリテラルはそれだけで正規表現のリテラルです
# かなりperl的なのです^q^
puts /^regexp$/.inspect # /^regexp$/
puts /^regexp$/.class # Regexp
puts "="*20
# 正規表現が文字列に含まれるか判定するには
# String#=~またはRegexp#=~を使います。
<<R.tap { |s| puts "#{s} # => #{eval s}" }
if (msg =~ /大好き/).tap { |r| puts "msg =~ /大好き/ # => \#{r}" }
"'#{msg}'に'大好き'は含まれます"
end
R
puts "="*20
# =~メソッドは、正規表現にマッチする場合にマッチする場合に、文字の位置(int)を返します。マッチしない場合はnilを返します。
# Rubyではnilとfalse以外は、どんな数値でも文字列でもtrueの判定なので、マッチするかどうか判定するならば
#
# if string =~ regexp
#
# でじゅうぶんです。
# ちょう楽ですね!!
#
# if regexp =~ string
#
# の順序でもまったく問題ありません。
# どちらを使うかは好みだと思います。
# グループを後から参照したい場合も楽です。
# 正規表現でマッチした時、マッチしたグループはグローバル変数$Nに格納されます。
# $1から順に順番に格納されます。
# ただし$0はプログラムの名前だったりします。
<<R.tap { |s| puts "#{s} # => #{eval s}" }
if msg =~ /(.+)大好き/
"ぼくが大好きなのは\#{$1}です"
end
R
puts "="*20
# また Regexp#=== メソッドは Regexp#=~ とほぼ同じ意味を持ちます。
# Object#===メソッドは代表としてcase-whenの構文で使用されます。よって以下のような書き方も有効です
<<R.tap { |s| puts "#{s} # => #{eval s}" }
case msg
when /大好き/
"しゃきん"
when /大嫌い/
"しょぼん"
end
R
puts "="*20
# ほかにも、String#splitやString#gsubなどありとあらゆるメソッドに正規表現リテラルを渡すだけで期待通りに動作します。
#
# すごい!! やっぱりRuby正規表現はいいですね!!
$ ruby ~/gists/easy_regexp.rb
/^regexp$/
Regexp
====================
msg =~ /大好き/ # => 4
if (msg =~ /大好き/).tap { |r| puts "msg =~ /大好き/ # => #{r}" }
"'まなさん大好き'に'大好き'は含まれます"
end
# => 'まなさん大好き'に'大好き'は含まれます
====================
if msg =~ /(.+)大好き/
"ぼくが大好きなのは#{$1}です"
end
# => ぼくが大好きなのはまなさんです
====================
case msg
when /大好き/
"しゃきん"
when /大嫌い/
"しょぼん"
end
# => しゃきん
====================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment