Ruby 文字列(String)

RubyのStringオブジェクトは、1つ以上のバイトのシーケンスを格納または操作するために使用されます。

Rubyの文字列は、シングルクォート文字列(')とダブルクォート文字列(")に分けられます。違いは、ダブルクォート文字列はより多くのエスケープ文字をサポートできることです。

シングルクォート文字列

最も単純な文字列はシングルクォート文字列です。つまり、シングルクォート内に文字列を格納します:

'これはRubyプログラムの文字列です'

シングルクォート文字列内でシングルクォート文字を使用する必要がある場合は、シングルクォート文字列でバックスラッシュ(\)を使用する必要があります。これにより、Rubyインタープリタはこのシングルクォート文字を文字列の終端記号と見なさなくなります:

'Won\'t you read O\'Reilly\'s book?'

バックスラッシュは別のバックスラッシュもエスケープできます。これにより、2番目のバックスラッシュ自体はエスケープ文字として解釈されません。

以下はRubyにおける文字列関連の特性です。

ダブルクォート文字列

ダブルクォート文字列では、次のものを使用できます:#{}シャープ記号と中括弧を使用して式の値を計算できます:

文字列に変数を埋め込む:

例

#!/usr/bin/ruby # -*- coding: UTF-8 -*- name1 = "Joe" name2 = "Mary" puts "こんにちは #{name1}、#{name2} はどこですか?"

試してみる »

上記の例を実行した出力結果は次のとおりです:

你好 Joe,  Mary 在哪?

文字列内で数学演算を行う:

例

#!/usr/bin/ruby # -*- coding: UTF-8 -*- x, y, z = 12, 36, 72 puts "x の値は #{ x }" puts "x + y の値は #{ x + y }" puts "x + y + z の平均値は #{ (x + y + z)/3 }"

試してみる »

上記の例を実行した出力結果は次のとおりです:

x 的值为 12
x + y 的值为 48
x + y + z 的平均值为 40

Rubyでは、%q と %Q を使用して導く文字列変数もサポートされています。%q はシングルクォートの引用規則を使用し、%Q はダブルクォートの引用規則を使用します。その後に (! [ { などの開始区切り文字と } ] ) などの末尾区切り文字を続けます。

q または Q の後に続く文字は区切り文字です。区切り文字は、英数字以外の任意の1バイト文字を使用できます。例:[, {, (, <, ! など。文字列は、対応する終了区切り文字が見つかるまで読み取られます。

例

#!/usr/bin/ruby # -*- coding: UTF-8 -*- desc1 = %Q{Rubyの文字列では '' と "" を使用できます。} desc2 = %q|Rubyの文字列では '' と "" を使用できます。| puts desc1 puts desc2

試してみる »

上記の例を実行した出力結果は次のとおりです:

Ruby 的字符串可以使用 '' 和 ""。
Ruby 的字符串可以使用 '' 和 ""。

エスケープ文字

次の表は、バックスラッシュ記号を使用してエスケープできるエスケープ文字または非印刷文字を示しています。

注意:ダブルクォートで囲まれた文字列内では、エスケープ文字は解析されます。シングルクォートで囲まれた文字列内では、エスケープ文字は解析されず、そのまま出力されます。

バックスラッシュ記号16進文字説明
\a0x07ベル文字
\b0x08バックスペース
\cx Control-x
\C-x Control-x
\e0x1bエスケープ文字
\f0x0cフォームフィード
\M-\C-x Meta-Control-x
\n0x0a改行
\nnn 8進表記。n の範囲は 0〜7
\r0x0dキャリッジリターン
\s0x20スペース
\t0x09タブ
\v0x0b垂直タブ
\x 文字 x
\xnn 16進表記。n の範囲は 0〜9、a〜f、または A〜F

文字エンコーディング

Rubyのデフォルトの文字セットはASCIIであり、文字は単一バイトで表すことができます。UTF-8 や他の最新の文字セットを使用する場合、文字は1〜4バイトで表されることがあります。

プログラムの先頭で $KCODE を使用して文字セットを変更できます。次のようにします:

$KCODE = 'u'

以下は $KCODE に設定可能な値です。

エンコーディング説明
aASCII(none と同じ)。これがデフォルトです。
eEUC。
nNone(ASCII と同じ)。
uUTF-8。

文字列の組み込みメソッド

String メソッドを呼び出すには、String オブジェクトのインスタンスが必要です。以下は String オブジェクトのインスタンスを作成する方法です:

new [String.new(str="")]

これにより返されるのは、strコピーを含む新しい文字列オブジェクトです。次に、... を使用します。strオブジェクトを使用して、利用可能な任意のインスタンスメソッドを呼び出すことができます。例:

例

#!/usr/bin/ruby myStr = String.new("THIS IS TEST") foo = myStr.downcase puts "#{foo}"

これにより次の結果が生成されます:

this is test

以下は公開されている文字列メソッドです(str は String オブジェクトと仮定します):

番号メソッド & 説明
1str % arg
書式指定を使用して文字列をフォーマットします。arg が複数の置換を含む場合、arg は配列である必要があります。書式指定の詳細については、「カーネルモジュール」の sprintf を参照してください。
2str * integer
integer 個の str を含む新しい文字列を返します。言い換えると、str が integer 回繰り返されます。
3str + other_str
other_str を str に連結します。
4str << obj
オブジェクトを文字列に連結します。オブジェクトが 0〜255 の範囲の固定数値 Fixnum の場合、1文字に変換されます。これを concat と比較してください。
5str <=> other_str
str を other_str と比較し、-1(未満)、0(等しい)、または 1(より大きい)を返します。比較は大文字と小文字を区別します。
6str == obj
str と obj の等価性をチェックします。obj が文字列でない場合は false を返し、str <=> obj が 0 を返す場合は true を返します。
7str =~ obj
正規表現パターン obj で str をマッチングします。マッチが始まる位置を返し、それ以外の場合は false を返します。
8str[position] # 返されるのは文字ではなくASCIIコードであることに注意
str[start, length]
str[start..end]
str[start...end]

インデックスを使用して部分文字列を抽出する
9str.capitalize
文字列の最初の文字を大文字に変換し、残りを小文字に変換して表示します。
10str.capitalize!
capitalize と同じですが、変更がない場合、capitalize! は nil を返します。
11str.casecmp
大文字と小文字を区別しない文字列比較。
12str.center
文字列を中央寄せします。
13str.chomp
文字列の末尾からレコード区切り文字($/)、通常は \n を削除します。レコード区切り文字がない場合は、何も行いません。
14str.chomp!
chomp と同じですが、str が変更されて返されます。
15str.chop
str の最後の文字を削除します。
16str.chop!
chop と同じですが、str が変更されて返されます。
17str.concat(other_str)
other_str を str に連結します。
18str.count(str, ...)
1つ以上の文字セットをカウントします。複数の文字セットがある場合、それらのセットの共通部分をカウントします。
19str.crypt(other_str)
str に一方向暗号化ハッシュを適用します。引数は2文字の長さの文字列で、各文字の範囲は a〜z、A〜Z、0〜9、. または / です。
20str.delete(other_str, ...)
str のコピーを返します。引数の共通部分に含まれるすべての文字が削除されます。
21str.delete!(other_str, ...)
delete と同じですが、str が変更されて返されます。
22str.downcase
str のコピーを返します。すべての大文字が小文字に置き換えられます。
23str.downcase!
downcase と同じですが、str が変更されて返されます。
24str.dump
str のバージョンを返します。すべての非印刷文字が \nnn 記号に置き換えられ、すべての特殊文字がエスケープされます。
25str.each(separator=$/) { |substr| block }
引数をレコード区切り文字(デフォルトは $/)として str を分割し、各サブ文字列を指定されたブロックに渡します。
26str.each_byte { |fixnum| block }
str の各バイトを block に渡し、各バイトを10進表記で返します。
27str.each_line(separator=$/) { |substr| block }
引数をレコード区切り文字(デフォルトは $/)として str を分割し、各サブ文字列を指定されたブロックに渡します。
28str.empty?
str が空(長さが 0)の場合、true を返します。
29str.eql?(other)
2つの文字列が同じ長さと内容を持つ場合、それらの文字列は等しくなります。
30str.gsub(pattern, replacement) [or]
str.gsub(pattern) { |match| block }

str のコピーを返します。pattern のすべての出現箇所が replacement またはブロックの値に置き換えられます。pattern は通常、正規表現 Regexp です。文字列 String の場合、正規表現メタ文字は解釈されません(つまり、/\d/ は数字にマッチしますが、'\d' はバックスラッシュの後に 'd' が続くものにマッチします)。
31str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]
以下の引数で str を参照する:引数が Fixnum の場合、その fixnum の文字コードを返す。引数が2つの Fixnum の場合、オフセット(最初の fixnum)から長さ(2番目の fixnum)までの部分文字列を返す。引数が range の場合、その範囲内の部分文字列を返す。引数が regexp の場合、マッチした文字列の部分を返す。引数が fixnum 付きの regexp の場合、fixnum の位置にあるマッチデータを返す。引数が other_str の場合、other_str にマッチする部分文字列を返す。負の Fixnum は文字列の末尾 -1 から始まる。
32str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] =new_str [or] str[regexp, fixnum] =new_str [or] str[other_str] = new_str ]
文字列全体または部分文字列を置換する。slice! と同義。
33str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }
String#gsub の置換を実行し、str を返す。置換が実行されなかった場合は nil を返す。
34str.hash
文字列の長さと内容に基づくハッシュを返す。
35str.hex
str の先頭文字を16進数の文字列(オプションの符号とオプションの 0x)として解釈し、対応する数値を返す。エラーの場合はゼロを返す。
36str.include? other_str [or] str.include? fixnum
str が指定された文字列または文字を含む場合、true を返す。
37str.index(substring [, offset]) [or]
str.index(fixnum [, offset]) [or]
str.index(regexp [, offset])

指定された部分文字列、文字(fixnum)、またはパターン(regexp)が str 内で最初に出現するインデックスを返す。見つからない場合は nil を返す。2番目の引数が指定された場合、文字列内で検索を開始する位置を指定する。
38str.insert(index, other_str)
指定されたインデックスの文字の前に other_str を挿入し、str を変更する。負のインデックスは文字列の末尾から数え、指定された文字の後に挿入する。これは、指定されたインデックスで文字列の挿入を開始することを意図している。
39str.inspect
特殊文字がエスケープされた、str の印刷可能なバージョンを返す。
40str.intern [or] str.to_sym
str に対応するシンボルを返す。以前に存在しない場合はシンボルを作成する。
41str.length
str の長さを返す。size と比較すること。
42str.ljust(integer, padstr=' ')
integer が str の長さより大きい場合、長さが integer の新しい文字列を返す。新しい文字列は str を左詰めし、padstr で埋められる。それ以外の場合は str を返す。
43str.lstrip
先頭の空白を除去した str のコピーを返す。
44str.lstrip!
str から先頭の空白を除去する。変更がない場合は nil を返す。
45str.match(pattern)
pattern が正規表現でない場合、pattern は正規表現 Regexp に変換され、str 上でそのマッチメソッドが呼び出される。
46str.oct
str の先頭文字を10進数の文字列(オプションの符号)として解釈し、対応する数値を返す。変換に失敗した場合は 0 を返す。
47str.replace(other_str)
str の内容を other_str の対応する値で置き換える。
48str.reverse
str を逆順にした新しい文字列を返す。
49str.reverse!
str を逆順にする。str は変更されて返される。
50str.rindex(substring [, fixnum]) [or]
str.rindex(fixnum [, fixnum]) [or]
str.rindex(regexp [, fixnum])

指定された部分文字列、文字(fixnum)、またはパターン(regexp)が str 内で最後に出現するインデックスを返す。見つからない場合は nil を返す。2番目の引数が指定された場合、文字列内で検索を終了する位置を指定する。その位置を超える文字は考慮されない。
51str.rjust(integer, padstr=' ')
integer が str の長さより大きい場合、長さが integer の新しい文字列を返す。新しい文字列は str を右詰めし、padstr で埋められる。それ以外の場合は str を返す。
52str.rstrip
末尾の空白を除去した str のコピーを返す。
53str.rstrip!
str から末尾の空白を除去する。変更がない場合は nil を返す。
54str.scan(pattern) [or]
str.scan(pattern) { |match, ...| block }

どちらの形式も pattern(正規表現 Regexp または文字列 String のいずれか)で str を走査する。各マッチに対して結果が生成され、結果は結果配列に追加されるか、block に渡される。pattern がグループを含まない場合、各結果はマッチした文字列 $& で構成される。pattern がグループを含む場合、各結果は各グループのエントリを含む配列となる。
55str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]
str.slice(range) [or] str.slice(regexp) [or]
str.slice(regexp, fixnum) [or] str.slice(other_str)
See str[fixnum], etc.
str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or] str.slice!(range) [or] str.slice!(regexp) [or] str.slice!(other_str)

str から指定された部分を削除し、削除した部分を返す。値が範囲外の場合、Fixnum を引数に取る形式は IndexError を発生させる。range を引数に取る形式は RangeError を発生させ、Regexp と String を引数に取る形式はアクションを無視する。
56str.split(pattern=$;, [limit])

区切り文字に基づいて str を部分文字列に分割し、それらの部分文字列の配列を返す。

もしpatternが文字列 String の場合、str を分割する際に区切り文字として使用される。pattern が単一のスペースの場合、str はスペースに基づいて分割され、先頭のスペースと連続するスペース文字は無視される。

もしpatternが正規表現 Regexp の場合、str は pattern がマッチする場所で分割される。pattern がゼロ長の文字列にマッチする場合、str は単一の文字に分割される。

省略された場合patternパラメータは、$; の値が使用される。$; が nil(デフォルト)の場合、str はスペースに基づいて分割される。これは区切り文字として ` ` を指定したのと同じである。

省略された場合limitパラメータは、末尾の null フィールドが抑制される。limit が正の数の場合、最大でその数のフィールドが返される(limit が 1 の場合、配列の唯一のエントリとして文字列全体が返される)。limit が負の数の場合、返されるフィールド数に制限はなく、末尾の null フィールドも抑制されない。

57str.squeeze([other_str]*)
String#count で説明されている手順を使用して、other_str 引数から文字の集合を構築する。集合に含まれる同じ文字の連続が単一の文字に置き換えられた新しい文字列を返す。引数が指定されない場合、すべての同じ文字の連続が単一の文字に置き換えられる。
58str.squeeze!([other_str]*)
squeeze と同じだが、str が変更されて返される。変更がない場合は nil を返す。
59str.strip
先頭の空白と末尾の空白を除去した str のコピーを返す。
60str.strip!
str から先頭の空白と末尾の空白を除去する。変更がない場合は nil を返す。
61str.sub(pattern, replacement) [or]
str.sub(pattern) { |match| block }

pattern の最初の出現が replacement または block の値に置き換えられた str のコピーを返す。pattern は通常、正規表現 Regexp である。文字列 String の場合、正規表現メタ文字は解釈されない。
62str.sub!(pattern, replacement) [or]
str.sub!(pattern) { |match| block }

String#sub の置換を実行し、str を返す。置換が実行されなかった場合は nil を返す。
63str.succ [or] str.next
str の後継を返す。
64str.succ! [or] str.next!
String#succ と同等だが、str が変更されて返される。
65str.sum(n=16)
str 内の文字の n ビットチェックサムを返す。n はオプションの Fixnum 引数で、デフォルトは 16 である。結果は、str 内の各文字のバイナリ値を単純に合計し、2n - 1 を法としたものである。これは特に優れたチェックサムではない。
66str.swapcase
すべての大文字を小文字に、すべての小文字を大文字に変換した str のコピーを返す。
67str.swapcase!
String#swapcase と同等だが、str が変更されて返される。変更がない場合は nil を返す。
68str.to_f
str の先頭文字を浮動小数点数として解釈した結果を返す。有効数字の末尾を超える余分な文字は無視される。str の先頭に有効な数字がない場合は 0.0 を返す。このメソッドは例外を発生させない。
69str.to_i(base=10)
str の先頭文字を整数の基数(基数 2、8、10、または 16)として解釈した結果を返す。有効数字の末尾を超える余分な文字は無視される。str の先頭に有効な数字がない場合は 0 を返す。このメソッドは例外を発生させない。
70str.to_s [or] str.to_str
受け取った値を返す。
71str.tr(from_str, to_str)
from_str 内の文字を to_str 内の対応する文字に置き換えた str のコピーを返す。to_str が from_str より短い場合、最後の文字で埋められる。両方の文字列は c1.c2 記法で文字の範囲を表すことができる。from_str が ^ で始まる場合、リストされた文字以外のすべての文字を表す。
72str.tr!(from_str, to_str)
String#tr と同等だが、str が変更されて返される。変更がない場合は nil を返す。
73str.tr_s(from_str, to_str)
str を String#tr で説明されている規則に従って処理し、翻訳の影響を受ける重複文字を除去する。
74str.tr_s!(from_str, to_str)
String#tr_s と同等だが、str が変更されて返される。変更がない場合は nil を返す。
75str.unpack(format)
format 文字列に従って str(バイナリデータを含む可能性がある)をデコードし、抽出された各値の配列を返す。format 文字は一連の単一文字ディレクティブで構成される。各ディレクティブの後には数値を付けることができ、そのディレクティブを繰り返す回数を示す。アスタリスク(*)は残りのすべての要素を使用する。ディレクティブ sSiIlL の各々の後にはアンダースコア(_)を付けることができ、指定された型に基盤となるプラットフォームのネイティブサイズを使用し、それ以外の場合はプラットフォームに依存しない一貫したサイズを使用する。format 文字列内のスペースは無視される。
76str.upcase
すべての小文字が大文字に置き換えられた str のコピーを返す。この操作は環境に依存せず、a から z の文字のみが影響を受ける。
77str.upcase!
str の内容を大文字に変更する。変更がない場合は nil を返す。
78str.upto(other_str) { |s| block }
連続する値を走査し、str から始まり other_str で終わる(両端を含む)、各値を順番に block に渡す。各値の生成には String#succ メソッドが使用される。

文字列のunpackディレクティブ

以下の表は、String#unpack メソッドの unpack ディレクティブを一覧にしたものである。

ディレクティブ戻り値説明
AString末尾の null とスペースを削除します。
aString文字列。
BString各文字からビットを抽出します(最初は最上位ビット)。
bString各文字からビットを抽出します(最初は最下位ビット)。
CFixnum1文字を符号なし整数として抽出します。
cFixnum1文字を整数として抽出します。
D, dFloatsizeof(double) の長さの文字をネイティブの double として扱います。
EFloatsizeof(double) の長さの文字をリトルエンディアンバイト順の double として扱います。
eFloatsizeof(float) の長さの文字をリトルエンディアンバイト順の float として扱います。
F, fFloatsizeof(float) の長さの文字をネイティブの float として扱います。
GFloatsizeof(double) の長さの文字をネットワークバイト順の double として扱います。
gFloatsizeof(float) の長さの文字をネットワークバイト順の float として扱います。
HString各文字から16進数を抽出します(最初は最上位ビット)。
hString各文字から16進数を抽出します(最初は最下位ビット)。
IIntegersizeof(int) の長さ(_ で変更)の連続文字をネイティブの integer として扱います。
iIntegersizeof(int) の長さ(_ で変更)の連続文字をネイティブの符号付き integer として扱います。
LInteger4つの(_ で変更)連続文字をネイティブの符号なし long integer として扱います。
lInteger4つの(_ で変更)連続文字をネイティブの符号付き long integer として扱います。
MStringquoted-printable エンコード。
mStringBase64 エンコード。
NInteger4つの文字をネットワークバイト順の符号なし long として扱います。
nFixnum2つの文字をネットワークバイト順の符号なし short として扱います。
PStringsizeof(char *) の長さの文字をポインタとして扱い、参照された位置から \emph{len} 文字を返します。
pStringsizeof(char *) の長さの文字を null終端の文字列へのポインタとして扱います。
QInteger8つの文字を符号なし quad word(64ビット)として扱います。
qInteger8つの文字を符号付き quad word(64ビット)として扱います。
SFixnum2つの(_ を使用すると異なる)連続文字をネイティブバイト順の符号なし short として扱います。
sFixnum2つの(_ を使用すると異なる)連続文字をネイティブバイト順の符号付き short として扱います。
UIntegerUTF-8 文字を符号なし整数として扱います。
uStringUU エンコード。
VFixnum4つの文字をリトルエンディアンバイト順の符号なし long として扱います。
vFixnum2つの文字をリトルエンディアンバイト順の符号なし short として扱います。
wIntegerBER 圧縮の整数。
X 後方に1文字スキップします。
x 前方に1文字スキップします。
ZString* と一緒に使用すると、最初の null まで末尾の null を削除します。
@ length 引数で指定されたオフセットをスキップします。

例

以下の例を試して、さまざまなデータをアンパックしてください。

"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "] "abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"] "abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "] "aa".unpack('b8B8') #=> ["10000110", "01100001"] "aaa".unpack('h2H2c') #=> ["16", "61", 97] "\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534] "now=20is".unpack('M*') #=> ["now is"] "whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"]
その他の拡張