こんにちは、エンジニアのitogaです。

今回は、初心者が取っ掛かりにくいと思われる正規表現についてrubyを使いながら解説していきます。rubyや特定の言語での正規表現の利用に関する解説記事は山ほどありますが、そもそも正規表現はrubyに限らずあらゆる言語で利用されています。なればこそ正規表現そのものへの理解を深めたい、とは思いつつも正規表現自体の解説は小難しくてわかりにくい、そんな方々にこの記事を読んでわかった気になってもらえればと思います。

rubyでの正規表現の利用

rubyでの正規表現の使い方については、先人が良記事をたくさん残してくださっているので詳しくは書きません。ここでは、最もコンパクトな基本であるmatch?メソッドと他記事にあまり無いけどよく使うsliceメソッドのみ紹介します。

match?メソッド

str_sato = 'id:1, name:sato, age:18, address:tokyo'
p str_sato.match?(/sato/) # true
p str_sato.match?(/.ato/) # true

str_mato = 'id:2, name:mato, age:21, address:hokkaido'
p str_mato.match?(/sato/) # false
p str_sato.match?(/.ato/) # true

sliceメソッド

str_sato = 'id:1, name:sato, age:18, address:tokyo'
puts str_sato.slice(/name:.ato/) # name:sato
puts str_sato.slice(/name:(.ato)/,1) # sato
# sliceメソッドは[]と同意義
puts str_sato[/name:(.ato)/,1] # sato

sliceメソッドは、文字列からパターンにマッチする文字列を抜き出す際に簡単に出来るので重宝します。matchメソッドなどを使っても出来ますが、rubyではsliceがこれに最も適したメソッドになります。

正規表現とは

僕の認識では便利なワイルドカードです。より固く説明すると「特定の文字列パターンを表現するルールまたはそのルールに則った表現」だと思っています。

どの部分が正規表現なのか

rubyなど特定の言語しか触っていない人だと勘違いしやすいかもしれませんが、以下のようなサンプルがあった時、利用されている正規表現は「.ato」です。前後のスラッシュは、その中身がrubyのプログラムではないことを示す目印であり、扱いとしては文字列のダブルクォーテーションなどと同じです。

p str_sato.match?(/.ato/)

つまり、スラッシュで囲えば正規表現、というものはrubyの仕様であり正規表現そのものとは関係ありません。例えばUNIXのgrepコマンドではスラッシュを使わずに以下のように正規表現を利用します。

$ echo "id:1
name:sato
age:18
address:tokyo" | grep -E '.ato'
> name:sato

正規表現の種類

正規表現について調べていると「〇〇正規表現」のような表記をよく見ます。大まかな種類をまとめると以下の表のようになっており、基本的には下に行くほど機能が拡張されています。例えばPCREに対応しているrubyやpythonで正規表現を使う時は、その拡張下であるBRE,EREの機能ももちろん利用することが出来ます。

名称呼称 英名(略称) 説明
POSIX正規表現 UNIX系のOSで利用できる正規表現の総称。
基本正規表現 Basic Regular Expressions(BRE) POSIX正規表現の一種。
UNIXでデフォルトで利用される正規表現のほとんどはこれ。
拡張正規表現 Extended Regular Expressions(ERE) POSIX正規表現の一種。
BREからOR条件のパイプ「|」など機能拡張した正規表現。
Perl形式の正規表現 Perl Compatible Regular Expressions(PCRE) EREから数字を表す略記「\d」などを拡張した正規表現。
ruby,python,javaなどで利用されている。

あとがき

いかがでしたでしょうか。正規表現とは何なのかや正規表現の種類については、他言語で正規表現を触る時や自分の環境で使える正規表現について調べる時に役に立つ知識となるかと思います。正規表現は、プログラミングでの文字列操作やエディタでの文字列検索などで便利に使えるので、プログラマーとしてぜひ抑えておきたい技術の1つですね。

Pocket