正規表現は平たくいうと、登録されるデータのフォーマットを調整する処理のこと。
文字列に特定の文字が含まれているかを確認することや
特定の文字を取り除くなどの操作を行うための技術が正規表現です。
具体例をあげると
アカウントの登録でパスワードが10文字未満だったり、メールアドレスに@が入っていなかったりすると
ユーザー登録ができなくなる、又は電話番号の登録で-入りで登録すると
-が抜かれた別のフォーマットで登録される処理のことです。
正規表現メソッド
- subメソッド(置き換えメソッド)
- matchメソッド
subメソッド
文字列の指定した部分を別の文字列に置き換えるためのメソッドです。
第一引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定します。
また、操作したい文字列は/で囲みます。
具体例はこちら
irb
irb(main):001:0> str = "ラーメンを食べる"
=> "ラーメンを食べる"
irb(main):002:0> str.sub(/ラーメン/,"蕎麦")
=> "蕎麦を食べる"
matchメソッド
引数に指定した文字列がレシーバの文字列に含まれているか否かをチェックするためのメソッドです。
irb
# 例1 単純使用で、nilが返すか返されないか
irb(main):001:0> str = "Hello, World"
=> "Hello, World"
irb(main):002:0> str.match(/Hello/)
=> #<MatchData "Hello">
irb(main):003:0> str.match(/Good/)
=> nil
# 例2 含まれたのを確認した上で出力する場合
irb(main):001:0> rei = "Hello, World"
=> "Hello, World"
irb(main):002:0> kekka = rei.match(/Hello/)
=> #<MatchData "Hello">
irb(main):003:0> kekka[0]
=> "Hello"
MatchDataオブジェクト
マッチした文字列等はMatchDataオブジェクトで返されます。
MatchDataオブジェクトから文字列等を取り出す際は 「kekka[0]」のように指定して出力します。
具体使用例
電話番号のハイフンを取り除く
ここではハイフンを取り除く処理を書いてみます。
ただしsunとgsubでは使用に違いがあるので注意が必要です。
irb
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"
# 全ての対象に
subメソッド,gsubメソッドの違い
- subメソッド・・・最初の一文字のみ
- gsubメソッド・・・全ての対象に
パスワードに英数字10文字以上という制約を設定する
irb
irb(main):001:0> pass = 'Hoge1234'
=> "Hoge1234"
irb(main):002:0> pass.match(/[a-z\d]{10,}/i)
=> #<MatchData "Hoge1234">
matchメソッドのポイント1
- [a-z]: 角括弧で囲まれた文字のいずれか 1 個にマッチ
- \d: 数字にマッチ
- {n, m}: 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ
- i: 大文字・小文字を区別しない検索
メールアドレスからドメインの部分のみ抽出する
irb
irb(main):001:0> mail = 'rei@camp.com'
=> "rei@camp.com"
irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@camp.com">
matchメソッドのポイント2
- 「.」どの1 文字にもマッチ
- 「+」直前の文字の 1 回以上の繰り返しにマッチ
パターン表記
パターン | 意味 |
---|---|
[a-z] | 角括弧で囲まれた文字のいずれか 1 個にマッチ |
\d | 数字にマッチ |
{n, m} | 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ |
. | どの1 文字にもマッチ |
+ | 直前の文字の 1 回以上の繰り返しにマッチ |