はじめに
正規表現(主にRuby)とは何か、について調べたことをここにまとめます。
正規表現とは
色々調べてみた中で私なりに、
たくさんある文字列の中からある一定のパターンで記述されている文字列を探し出すための表現
ということなのかな、と理解しました。
Rubyにおける正規表現
正規表現は英語でRegular Expressionと言い、RubyではRegexpクラスというものが正規表現を扱うためのクラスになります。
また、正規表現と組み合わせて使えるStringクラスのメソッドがいくつかあり、今回は下記2つのメソッドについて簡単な使い方を実践しながらまとめてみました。
gsub
第一引数の正規表現にマッチした文字列を第二引数の文字列で置き換える
- 「1+10-100」という文字列の「+」と「-」を「,」に置き換えてみたいと思います。
ここで使った//の中が正規表現となっており、「|」はメタ文字1で“または”という意味。
また、「+」は文字列での「+」を表したいのですが、これもメタ文字で“直前の文字やパターンが1回以上連続する”という意味を持っているため、そのまま書くとメタ文字として扱われてしまいます。
そのため、直前に「\」を付けることによってエスケープ2させています。
str = '1+10-100'
str.gsub(/\+|-/,',')
#=> 1,10,100
[],slice
正規表現にマッチする部分を抜き出す
- 「誕生日は2000年12月31日です」という文字列から[]を使って生年月日だけ抜き出します。
前述の通り、//の中身が正規表現で、「\d」は“半角数字1文字”を、「+」は“直前の文字やパターンが1回以上連続する”という意味を持っています。
str = '誕生日は2000年12月31日です'
str[/\d+年\d+月\d+日/]
#=> 2000年12月31日
- 「私のメールアドレスはaddress_0123@mail.comです」という文字列からsliceを使ってメールアドレスの部分だけ抜き出します。(メールアドレスの部分がリンクになってしまうのでここでは@を全角にしました。)
「\w」は半角英数字と「_」を表します。
「.」は“任意の1文字”というメタ文字なので「\」でエスケープしています。
str1 = '私のメールアドレスはaddress_0123@mail.comです'
str1.slice(/\w+@\w+\.\w+/)
#=> address_0123@mail.com
- 「今日の運勢は大吉です!」という文字列の今日の運勢にあたる部分だけをsliceを使って抜き出します。ただし運勢の部分は文字数が変わります。
()でキャプチャする部分を指定し、第二引数で何番目かを指定することでその部分だけを抜き出すことができる。
str2 = '今日の運勢は大吉です!'
str2.slice(/今日の運勢は(.+)です!/,1)
#=> 大吉
まとめ
初めて正規表現という言葉を調べた時はよくわからなくて飛ばしてしまったのですが、今回改めて調べてみることで、使い方によってはとても便利なものなのだと感じました。
今後も少しずつ理解を深めていきたいと思います。