RubyのString/Regexpクラスによる強力な文字列操作/正規表現:若手エンジニア/初心者のためのRuby 2.1入門(5)(1/3 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、文字列操作でよく使われるStringクラスのメソッドや、正規表現の基本的な使い方、マッチング、メタ文字、アンカー、グループ化などについて。
前回の「RubyのRangeクラスと範囲オブジェクト、範囲演算子、イテレーターの使い方」では、数などの範囲を表現するためのRangeクラスと、ArrayクラスやHashクラス、Rangeクラスに関わりの深い概念である「イテレーター」について解説しました。
今回も、引き続きRubyの組み込みクラスの解説を行います。ここでは、特に文字列を表現するためのStringクラスと、正規表現を扱うためのRegexpクラスについて学びましょう。
Stringクラスにも有用なメソッドがたくさんありますし、正規表現は文字列と密接に関わっており、文字列を扱う上で非常に強力な武器となります。ただし強力であると同時に、自分以外の人が書いた正規表現の意味を理解するのは困難です。用法用量を守って正しく正規表現を使いこなしましょう。
Stringクラスのメソッドに文字列操作を、よく使うものを中心に紹介
Stringクラスは文字列を表現するクラスです。ここでは、逆引き的に、実際によく使うメソッドを中心に紹介します。もっとStringについて知りたい場合は、リファレンスマニュアルを参考にしてください。今回も、pryを使って確認していきましょう。
大文字と小文字の変換
まずは、大文字と小文字にまつわるメソッドです。
String#capitalizeで文字列の先頭を大文字に、残りを小文字に変更
String#capitalizeは、文字列の先頭を大文字に、残りを小文字に変更したものを返すメソッドです。破壊的メソッド版のString#capitalize!もあります。
[1] pry(main)> teapot = "tea" => "tea" [2] pry(main)> teapot.capitalize => "Tea"
String#upcase/#downcaseで文字列を全て大文字/小文字に
String#upcaseは文字列を全て大文字に、String#downcaseは文字列を全て小文字に変えたものを返すメソッドです。破壊的メソッド版のString#upcase!やString#downcase!もあります。
[3] pry(main)> teapot.upcase => "TEA" [4] pry(main)> teapot.downcase => "tea"
String#swapcaseで文字列のアルファベットの大文字・小文字を入れ替え
String#swapcaseは、文字列のアルファベットの大文字・小文字を入れ替えた文字列を返すメソッドです。以下の例では、teapotに格納されている"tea"をcapitalizeしたもの("Tea")を、さらにswapcaseで大文字・小文字を入れ替えています。
[5] pry(main)> teapot.capitalize.swapcase => "tEA"
String#strip/#lstrip/#rstripで空白文字の除去
先頭と末尾の空白文字を除去する場合には、String#stripやString#lstrip、String#rstripを使います。また、それぞれ破壊的メソッド版もあります。
[1] pry(main)> teapot = " tea " => " tea " [2] pry(main)> teapot.strip => "tea" [3] pry(main)> teapot.lstrip => "tea " [4] pry(main)> teapot.rstrip => " tea"
[2]のように、String#stripは文字列の先頭および末尾の空白文字を取り除いた文字列を返します。また、[3]のようにString#lstripは先頭の空白文字を、String#rstripは[4]のように末尾の空白文字を取り除いたものを返します。
Stringクラスのメソッドで繰り返し処理
1文字ずつ処理する場合(String#each_char)
文字列に含まれる文字を1文字ずつ処理したい場合は、String#each_charが使えます。string01.rbに、簡単なサンプルを示します。
"Alice".each_char do |char| puts char end
$ ruby string01.rb A l i c e
取り出された文字は、ブロック変数charに格納され、ブロックの中で自由に使うことができます。このサンプルでは、putsメソッドを用いて、1文字ずつ改行を入れて画面に出力しています。
1行ずつ処理する場合(String#each_line)
改行で区切られた文字列の場合、String#each_lineを使うことで、1行ずつ文字列を取り出して処理できます。string02.rbに、文字列を1行ずつ取り出して大文字に変えて出力するサンプルを示します。each_lineの対象となる文字列には改行コード(\n)が含まれており、その部分が改行であることを示しています。
"Alice found\na bottle".each_line do |line| puts line.upcase end
$ ruby string02.rb ALICE FOUND A BOTTLE
文字列の分解・連結・挿入・逆転
String#charsで文字列を文字ごとに分解して配列に直す
String#charsを使えば、文字列を分解して1文字ずつに分けた配列を得ることができます。以下の例では、"Alice"という文字列を分解し、1文字ずつ配列にしたものを生成しています。
[1] pry(main)> "Alice".chars => ["A", "l", "i", "c", "e"]
String#linesで複数行の文字列を行ごとに分解して配列に直す
String#linesを使えば、複数行の文字列を分解して、1行ずつに分けた配列を得ることができます。以下の例を見ると分かるように、改行コードもそのまま配列に格納されます。
[1] pry(main)> "Alice found\na bottle".lines => ["Alice found\n", "a bottle"]
+演算子を使う文字列の連結方法
最も直感的な文字列の連結法は、+演算子を使うやり方です。以下にその例を示します。
[1] pry(main)> "queen of" + " hearts" => "queen of hearts"
ただし、この方法では、+演算子を含む式が評価されて文字列が連結されるたびに新たなStringオブジェクトを生成するため、ある文字列を格納した変数に次々に文字列を連結しようとすると、非常にパフォーマンスが悪くなります。
String#concatや<<演算子を使う文字列の連結方法
もともと変数に文字列が格納してあり、その変数に対して破壊的に文字列を連結していく場合は、String#concatメソッドや<<演算子を利用するとよいでしょう。
以下に例を示します。
[2] pry(main)> teapot = "tea" => "tea" [3] pry(main)> teapot.concat("coffee") => "teacoffee" [4] pry(main)> teapot => "teacoffee" [5] pry(main)> teapot << "juice" => "teacoffeejuice" [6] pry(main)> teapot => "teacoffeejuice"
[2]では、teapotという変数に文字列"tea"を代入しています。[3]ではString#concatを使って文字列"coffee"を連結してます。この結果から分かるように、String#concatの戻り値は連結された後の文字列です。[5]では<<演算子を使って、[3]と同様に文字列を連結しています。
String#insertメソッドで文字列の挿入
String#insertを使うと、インデックスを用いて文字列の任意の場所に、新たな文字列を挿入できます。1つ目の引数にインデックスを、2つ目の引数に挿入したい文字列を与えます。
[1] pry(main)> "Alice a bottle".insert(6, "found ") => "Alice found a bottle"
String#reverseメソッドで文字列の逆転
String#reverseは、並びを逆転させた文字列を返します。String#reverse!はその破壊的メソッド版です。
[1] pry(main)> "Alice".reverse => "ecilA"
Copyright © ITmedia, Inc. All Rights Reserved.