正規表現とは
特徴的なのは
電話番号のハイフンを取り除く(文字列の一部分を置換する)
パスワードに英数字8文字以上という制約を設定する(文字列が制約を満たしているか調べる)
メールアドレスからドメインの部分のみ抽出する(文字列の一部分を抽出する)
などがあります。
正規表現にはsubメソッドとmatchメソッドがあります。
subメソッド
文字列の指定した部分を別の文字列に置き換えるためのメソッドです。
【例】ターミナル
$ irb
irb(main):001:0> str = "水を飲む"
=> "水を飲む"
irb(main):002:0> str.sub(/水/,"お茶")
=> "お茶を飲む"
操作したい文字列は/で囲みます。
matchメソッド
引数に指定した文字列がレシーバの文字列にあるかを確認するためのメソッドです。ある場合は、指定した文字列がMatchDataオブジェクトの返り値になります。ない場合は、返り値としてnilになります。
【例】ターミナル
rb(main):001:0> str = "おはよう, おやすみ"
=> "おはよう, おやすみ"
irb(main):002:0> str.match(/おはよう/)
=> #<MatchData "おはよう">
irb(main):003:0> str.match(/こんにちわ/)
=> nil
MatchDataオブジェクト
マッチした文字列等はMatchDataオブジェクトで返されます。MatchDataオブジェクトから文字列等を取り出してみます。
【例】ターミナル
irb(main):001:0> str = "おはよう, おやすみ"
=> "おはよう, おやすみ"
irb(main):002:0> md = str.match(/おはよう/)
=> #<MatchData "おはよう">
irb(main):003:0> md[0]
=> "おはよう"
ハイフンの取り除きかた
subメソッドでは最初のハイフンしか置換されないのでgsubメソッドを使います。
【例】
irb(main):001:0> tel = '090-1234-5678'
=> "090-1234-5678"
irb(main):002:0> tel.sub(/-/,'')
=> "0901234-5678"
irb(main):003:0> tel.gsub(/-/,'')
=> "09012345678"
このgは、指定した文字が複数ある場合、その全てを置換します。
パスワードに英数字の制約
【例】matchメソッドを使用します。
rb(main):001:0> pass = 'Hoge1234'
=> "Hoge1234"
irb(main):002:0> pass.match(/[a-z\d]{8,}/i)
=> #<MatchData "Hoge1234">
ここでは今までとかなり違う部分が出てきました。意味合いは
・[a-z]: 角括弧で囲まれた文字のいずれか1個にマッチ
・\d: 数字にマッチ
・{n, m}: 直前の文字が少なくともn回、多くてもm回出現するものにマッチ
・i: 大文字・小文字を区別しない検索
・.: どの1文字にもマッチ
・+: 直前の文字の 1 回以上の繰り返しにマッチ
[a-z]
角括弧で囲まれた文字の1つがマッチするかをチェックしています。また、-で範囲を設定することができます。指定なので[a-z]だけではなく[a-c]みたいにもできます。
【例】
irb(main):001:0> 'dog'.match(/[a-c]/)
=> nil
irb(main):002:0> 'dog'.match(/[a-d]/)
=> #<MatchData "d">
となります。
\d
\dは数字にマッチするので、[a-z\d]は「英数字のいずれか1つにマッチ」という意味になります。
【例】数字のみ抽出します
irb(main):001:0> 'abc 3 xyz'.match(/\d/)
=> #<MatchData "3">
{n, m}
直前の文字が少なくともn回、多くてもm回出現するものにマッチします。例えば{4,8}は、直前の文字が少なくとも4回出現、直後の文字が最大8回出現にマッチという意味になります。
【例】
irb(main):001:0> '12345678'.match(/\d{4,6}/)
=> #<MatchData "123456">
irb(main):002:0> '123'.match(/\d{4,6}/)
=> nil
i
大文字・小文字を区別しない検索します。iを付けない場合だと、[a-z]と小文字で記述しているので大文字にマッチしません。
【例】
irb(main):001:0> 'Dog'.match(/dog/)
=> nil
irb(main):002:0> 'Dog'.match(/dog/i)
=> #<MatchData "Dog">
.
ハイフンやピリオドなど含めたどの1文字にもマッチします。
【例】
irb(main):001:0> 'abc'.match(/./)
=> #<MatchData "a">
+
直前の文字が1回以上の繰り返しにマッチします。
【例】
irb(main):001:0> 'aaabbc'.match(/a+/)
=> #<MatchData "aaa">
.と+は何かしらの文字が1回以上繰り返すものにマッチします。例えばメールアドレスみたいに先頭に@を付けることで@から始まり、何かしらの文字が1回以上繰り返すものにマッチします。
【例】
irb(main):001:0> mail = 'hoge@takashi.com'
=> "hoge@takashi.com"
irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@takashi.com">