#正規表現とは
・文字列の一部分を置換
・文字列の一部分を抽出
・文字列が制約を満たしているか調べる
などの操作を行うための技術が正規表現です。
正規表現のほとんどの記述はどの言語間でも共有可能です。
#メソッドと使用例
###subメソッド
文字列の指定した部分を別の文字列に置き換える
irb(main):001:0> str = "リンゴを食べる"
=> "リンゴを食べる"
irb(main):002:0> str.sub(/リンゴ/,"オレンジ")
=> "オレンジを食べる"
変数strに文字列 "リンゴを食べる" が代入されています。
次にstrに対し、subメソッドを使用し、第一引数にリンゴ、第二引数にオレンジを指定しています。
出力すると、リンゴを食べる → オレンジを食べるになっています。
このように第一引数に置き換えたい文字列を「 / (スラッシュ)」囲み、第2引数に変換後の文字列を指定します。
###matchメソッド
文字列がメソッドの左の文字列に含まれているか否かをチェックする
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
変数strに文字列 "Hello, World" が代入されています
次にstrに対し、matchメソッドを使用し、引数にHelloを指定しています
"Hello, world" には指定した "Hello" という文字列は含まれているので、MatchDataオブジェクトの返り値として指定した文字列 "Hello" が得られます。
"Good" は含まれていないので、返り値はnilになります。
matchメソッドもsubメソッドと同じように引数を「 / (スラッシュ)」で囲みます。
###gsubメソッド
文字列の指定した部分を全て別の文字列に置き換える
irb(main):001:0> tel = '080-1234-5678'
=> "080-1234-5678"
irb(main):002:0> tel.sub(/-/,'')
=> "0801234-5678"
irb(main):003:0> tel.gsub(/-/,'')
=> "08012345678"
変数telには電話番号が代入されています。
次にsubメソッドでハイフンを空の文字列に置き換えることで取り除こうとしますが、最初のハイフンだけが置き換えられています。
指定した初めの文字列だけを置き換えるならsub,全て置き換えるならgsubを使います。
#正規表現のメタ文字
メタ文字は、特殊な意味・機能を持った文字で、これを使用することで様々な制約が可能になります。
種類が多いので、パスワードの制約を例に挙げる中でいくつか紹介します。
irb(main):001:0> pw = 'Abcd1234'
=> "Abcd1234"
irb(main):002:0> pw.match(/[a-z\d]{8,10}/i)
=> #<MatchData "Abcd1234">
上記は、
・aからzの英字、数字のいずれかの文字
・8文字以上10文字以内
・文字は大小どちらでも可
という制約をかけています。
引数の中身を分解し、それぞれの文字の意味を説明していきます
/[a-z\d]{8,10}/i
↓
/[a-z\d]{8,10}/ i(スッラッシュの中身の文字列は大文字小文字どちらでも可)
↓
[a-z\d] {8,10}(直前の文字が8から10文字出現するものにマッチ)
↓
[a-z] \d (数字にマッチ)
↓
[a-z] (aからzまでの文字いずれかにマッチ)
※今回はa-zに加え、数字も角括弧に囲まれているため、英数字いずれかにマッチする)
#まとめ
種類 | 意味 |
---|---|
[ ] | 囲まれたいずれか1つの文字にマッチ |
\d | 数字にマッチ |
{a,b} | 直前の文字がa回以上b回以下出現するものにマッチ |
i (オプション) | 大文字・小文字を区別しない |
基本的に紹介した2つのメソッドと正規表現のパターンを組み合わせることで様々な制約が実装できます。
パターンに関してはここに記したのは一例です。他にも正規表現を用いてできることはたくさんあります。