読者です 読者をやめる 読者になる 読者になる

気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Regexpクラスをirbで確かめる

Ruby Ruby資格取得

オブジェクトを生成(正規表現リテラル)

* a = /abcd/i
=> /abcd/i
> a.class
=> Regexp

正規表現リテラル /xxx/の末尾にはオプションを付けることが可能。複数でも可

オプションは下記

i : 大文字、小文字を無視する
m:正規表現の「.」で改行マッチさせる
x:空白や#からはじまるコメントを無視する

オブジェクトを生成(newメソッド)

> a = Regexp.new("abc",Regexp::MULTILINE)
=> /abc/m

Regexp.compileメソッドでも可能

正規表現オブジェクトでマッチング

match

マッチした場合、MatchDataオブジェクトを返却
マッチしない場合、nilを返却

a = /abc/
# Regexpのmatchメソッドを呼ぶ
a.match("abcde")
=> #<MatchData "abc">

# Stringのmatchメソッドを呼ぶ
"abcde".match(a)
=> #<MatchData "abc"> #結果は同じ

取得MatchDataの活用方法

マッチした部分md[0]と()に記録したmd[1]を表示する

str = "<HTML><HEAD>"
if md = str.match(/<(\w+)>/)
  puts md[0]
  puts md[1]
end

#=> <HTML>
#=> HTML

scan

正規表現にマッチした部分をすべて取得して配列として返却する マッチするものがなければ、空配列を返却する
文字列が指定された場合はマッチする部分文字列を配列に詰めて返却する

str1 = " I am a strong man. "
str1.scan(/\w+/)
#=> ["I", "am", "a", "strong", "man"]
str1.scan(/aaa/)
#=> []
str1.scan("a")
#=> ["a", "a", "a"]

str2 = "hokkaido:sapporo, aomori:aomori, iwate:morioka"
str2.scan(/(\w+):(\w+)/)
#=> [["hokkaido", "sapporo"], ["aomori", "aomori"], ["iwate", "morioka"]]

=~でマッチング

正規表現オブジェクト、文字列オブジェクトの両方に=~メソッドは存在
マッチした場合はマッチした箇所のインデックスを返却
マッチしなかった場合はnilを返却

> a =~ "abcde"
=> 0
> a =~ "eeabcde"
=> 2
> "eeabcde" =~ a
=> 2

===でマッチング

> a = /abc/
=> /abc/
> a === "aaabc"
=> true
> a === "zzz"
=> false

~でマッチング

~は特殊変数「$_」とマッチングするメソッドらしい。
マッチした位置のインデックスを返却

> $_ = "aaabcde"
=> "aaabcde"
> ~ Regexp.new("abc")
=> 2

正規表現特殊文字をエスケープ

* Regexp.escape("array.push(hash[key])")
=> "array\\.push\\(hash\\[key\\]\\)"