LoginSignup
1
0

More than 3 years have passed since last update.

Ruby 正規表現の学習2

Posted at

正規表現の様々なパターンを使ってみる

先日はsubメソッドmatchメソッドの基本的な使い方を載せてみました。
今回は、正規表現の様々なパターンを使って少しだけ応用的な使用方法を使ってみたいと思います。
今回、使ってみるパターンは以下の3つ。

  • 電話番号のハイフンを取り除く
  • パスワードに英数字8文字以上という制約を設定
  • メールアドレスからドメインの部分のみ抽出

1. 電話番号からハイフンを取り除く

ターミナル
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
    subの前にgが追加された、gsubメソッドと言い、gが意味するのは、グローバルマッチと言う。
    文字列内で指定した文字が複数含まれている場合、その全てを置換えすると言う意味になる。
    gsubだけではなくsubを使用した場合は、初めの1つだけ置換えされることになる。

2. パスワードに英数字8文字以上という制約を設定

以下はパスワードに「Hoge1234」という大文字小文字を区別した英字と数字を使用して、matchメソッドを使用して記述してみる。

ターミナル
irb(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: 大文字・小文字を区別しない検索

[a-z] : 角括弧で囲まれた文字のいずれか 1個にマッチ

a~cの英字を抽出
「dog」にはa〜cのどの英字も含まれていないのでマッチしない。

ターミナル
irb(main):001:0> 'dog'.match(/[a-c]/)
=> nil

\d : 数字にマッチ

  • \ddは数字を表す。数字と表すdのような文字を特殊文字と呼び、特殊文字を使用する場合は直前に\を記述するというルールがある。
  • [a-z\d]は「英数字のいずれか1つにマッチ」という意味になる。
ターミナル
irb(main):001:0> 'I have 3 pens'.match(/\d/)
=> #<MatchData "3">

{n, m} : 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ

少なくとも4回、多くても6回出現するものにマッチ
波括弧を使用することで文字数の制約を追加することができる。{4,6}は、直前の文字が少なくとも下記の場合は4回多くても6回数字がマッチという意味になり、2回目のirbはマッチする数字がないのでnilと返される。

ターミナル
irb(main):001:0> '12345678'.match(/\d{4,6}/)
=> #<MatchData "123456">

irb(main):002:0> '123'.match(/\d{4,6}/)
=> nil

i : 大文字・小文字を区別しない検索

  • iオプションを加えることで大文字・小文字を区別しないで検索する。
  • iオプションをつけずに[a-z]と小文字で記述すると大文字にマッチしなくなる。
  • 大文字・小文字の区別
ターミナル
irb(main):003:0> 'Cat'.match(/cat/)
=> nil

irb(main):004:0> 'Cat'.match(/cat/i)
=> #<MatchData "Cat">

実践的な使用例

irb
pass = 'Hoge1234'
if pass.match(/[a-z\d]{8,}/i)
  // パスワード設定の処理
else
  puts 'パスワードの形式が間違えています。'
end

メールアドレスからドメインの部分のみ抽出

hoge@sample-taka.com」というアドレスから「@sample-taka.com」の部分のみを取得したい場合。

ターミナル
irb(main):001:0> mail = 'hoge@sample-taka.com'
=> "hoge@sample-taka.com"

irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@sample-taka.com">

ポイント

  • . : どの1 文字にもマッチ
  • + : 直前の文字の 1 回以上の繰り返しにマッチ

.どの1文字にもマッチ

ハイフンやピリオドなど含めた全ての英数字において、どの1文字にもマッチする。

(例)

ターミナル
irb(main):001:0> 'hoge'.match(/./)
=> #<MatchData "h">

+直前の文字の 1 回以上の繰り返しにマッチ

直前の文字が 1 回以上の繰り返しにマッチする。

(例)

ターミナル
irb(main):001:0> 'aaabb'.match(/a+/)
=> #<MatchData "aaa">

以上の例に沿ってみると

  • .+は何かしたの文字が一回以上繰り返されるものにマッチする。
  • 先頭に@をつけることで「@から始まり、何かしらの文字が 1 回以上口返すものにマッチ」という意味になる。

まとめ

パターン 意味
[a-z] 角括弧で囲まれた文字のいずれか 1 個にマッチ
\d 数字にマッチ
{n,m} 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ
. どの 1 文字にもマッチ
+ 直前の文字の 1 回以上の繰り返しにマッチ

まだまだ奥深い正規表現ですが以上のことだけは最低限おさえて置きたいと思います。。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0