【入門編】Rubyで正規表現を扱う方法

プログラミング
Ruby初心者のために正規表現についてまとめました。関数と比べると名前の意味と一致しないケースが多く、暗号のように感じてしまうかもしれません。この理由で正規表現を避けてしまう初心者は存在しますが、覚えることで得られるメリットもあります。サンプルコード付きで、わかりやすく正規表現について解説しますので参考にしてください。
【入門編】Rubyで正規表現を扱う方法

Rubyの正規表現はプログラム初心者からすると、何を書いているのかまったくわからないと感じてしまうでしょう。
多彩であり、すべてを覚えるのは難しいかもしれませんが利便性が高いことは確かです。
今回はRubyの正規表現をテーマに可能な限り簡潔にまとめました。

正規表現とは?

プログラムにおける正規表現とは特定の文字または文字列を使用することで、あらゆる処理を実行できることを指します。
Rubyは他の言語と比べてもコード記入の自由度が高く、文法やルールを理解していないと思わぬ落とし穴にハマってしまうかもしれません。

正規表現のメリット

極論をいってしまえば、正規表現を使わなくてもプログラム自体の実行は可能です。
しかし、正規表現を使うメリットはありますので、まずは見てみましょう。

(1)文字列の検索や削除などが簡易的にできる

プログラムにおいて文字列の操作は頻繁に行われます。特に検索や削除などは多く使われ、正規表現で簡易的にできます。
複雑で行数の長いコードを書くよりも、すっきりと見やすくできます。このメリットだけでも正規表現を学ぶ重要性があります。

(2)確実性と高速な処理がなされている

正規表現はあらゆる処理の確実性と高速性を持っています。
たとえば文字列の検索は自身でコードを書くことはできます。しかし、バグが潜んでいる、または高速でない可能性もあります。
用意されているものを使うことで、コードを書く時間が減るのもポイントです。

正規表現一覧

正規表現を使いたいときの確認の際に役に立つと思いますので、主なものをまとめました。

正規表現(書き方) 内容
. 任意の1文字(改行はなし)
* 0回以上の繰り返し
+ 1回以上の繰り返し
? 0回か1回の繰り返し
-(ハイフン) 範囲の表現
[](ブランケットで囲む) いずれかの1文字にマッチ
^ いずれかの1文字にマッチしない
^ または \A 先頭にマッチ
$ または \Z 文末にマッチ
\d 10進数
\D 非10進数
\h 16進数
\H 非16進数
\b スペースなどによる単語の区切り
\t タブ文字
\n 改行

Rubyの正規表現は多彩であり、慣れないと覚えることは難しいです。
一言で正規表現といってもマッチさせるためのもの、パターンを読み取るものなどが存在します。
正規表現だけで1冊の本を出せてしまうほど、ボリュームが多く、奥が深いので興味ある方は調べてみるといいでしょう。

サンプルコードで学ぶRubyでの正規表現

正規表現の使い方を学ぶにはサンプルコードを見ながら、自身で実践してみることが一番です。代表的なものを用意しましたので確認してみましょう。

正規表現で文字列の抽出をする方法

文字列の抽出は多くの業務でも行われています。
Rubyでの方法として主に4つありますので見ていきましょう。

(1)matchでマッチした部分を抽出

string = "プログラムは努力, 運動はセンス"
md = string.match(/.*は努力/)
print(md[0])

match関数の内部は~は努力という部分を抽出しているため実行結果は「プログラムは努力」となります。*を使うことで検索文字列ごとの抽出を行っています。

(2)pre_matchでマッチした文字列の前の文字列を抽出

reg = /は努力/.match("プログラムは努力 運動はセンス")
print(reg.pre_match)

1行目で「は努力」がマッチ判定され、2行目のpre_matchで「は努力」の前の文字列である「プログラム」が抽出されます。

(4)post_matchでマッチした文字列の後の文字列を抽出

reg = /は努力/.match("プログラムは努力 運動はセンス")
print(reg.post_match)

post_matchは文字列の後ろの文字列を抽出します。
この場合の実行結果は「運動はセンス」です。

(5)=~でマッチしたインデックスを取得

puts /テスト/ =~ "テスト勉強をしよう"
puts /よ/ =~ "テスト勉強をしよう"
puts /あ/ =~ "テスト勉強をしよう"

=~を利用することで/文字列/がマッチしたインデックスを返してくれます。
上記コードの場合は1行目が0番目、2行目が7番目、3行目がnilを返す結果になります。

(6)!~でマッチしなかったらtrueを取得

puts /テスト/ !~ "テスト勉強をしよう"
puts /よ/ !~ "テスト勉強をしよう"
puts /あ/ !~ "テスト勉強をしよう"

!~を使うことでマッチしたなかったらtrueを返してくれます。
上記コードの場合は1行目はfalse,2行目はfalse,3行目がtrueを返します。

正規表現で置換をする方法

特定の文字列を検索し、置き換えることを置換といいます。
こちらも業務でよく使われますので、覚えておいて損はないです。

(1)gsubとgsub!で一致した文字列を一括置換する

構文としては下記になります。

対象の文字列.gsub(“置換したい文字列”,  “検索する文字列”)

一括置換したい場合に使用するといいでしょう。
サンプルコードは下記です。

string = "月月火水木金金"
puts string.gsub(/月/, "日")
puts string

実行結果は「日日火水木金金 月月火水木金金」となります。
gsubではなく、gsub!にすると変数sring自身が「日日火水木金金」に書き換わってしまうので使い分けるといいでしょう。

(2)subとsub!で最初にヒットした文字列のみを置換する

string = "月月火水木金金"
puts string.sub(/月/, "日")
puts string

subは1回目にヒットした文字列を置換します。
上記サンプルコードでは「日月火水木金金 月月火水木金金」となります。sub!はgsub!同様、文字列自身を書き換えてしまうので、こちらも使い分けるようにしましょう。

まとめ

正規表現は奥が深く、理解すれば便利に扱えるようになる Rubyの正規表現について簡単ではありますがまとめました。
正規表現は最初こそ理解しにくいかもしれませんが、慣れていくにつれて便利さに気づいていきます。
特にRubyの正規表現は多彩です。覚えることで効率化も図れますので、今回を機に正規表現の勉強をしていくといいでしょう。


TECH PLAYでは、エンジニアの方向けに勉強会・イベント情報を提供しています。
ご興味のある方はぜひご参加ください。


おすすめのコラム