最終更新:2010-08-09 (月) 04:03:24 (2452d)  

Ruby/String はてなブックマークを見る
Top / Ruby / String

Object>String

基本

  • p は変数の状態を出力するメソッド。
  • 正規表現の結果は$~とかに入ってくる。

四則演算

#+ 文字列の結合。
str2 = str0 + str1
p str2 #=> "abcdef"

#コレと同義
str2= str0.concat(str1) #文字列の連結

#*で繰り返し
str = "abc"
p str * 4   #=> "abcabcabcabc"

#% 文字列のフォーマット(sprintfみたいな感じ)
p "%#x"     % 10        # => "0xa"
p "%#x,%#o" % [10, 10]  # => "0xa,012
 

文字列比較

  • 変数 $= の値が真である時、比較はアルファベットの大文字小文字を無視して行われる。デフォルトはnil
  • $=は比較の情報を保持するグローバル変数
str1 == str2 
str1 > str2 
str1 >= str2 
str1 < str2 
str1 <= str2

str.casecmp        #アルファベットの大文字小文字の違いを無視して比較。
p 'a' <=> 'A'      #=> 1
p 'a'.casecmp('A') #=> 0
 

部分文字列

str[n]        #nバイト目(先頭は0)
str[n,m]      #nバイト目からmバイト
str[first..last]      #firstからlastバイト目まで
'abcd'[ 2 ..  3] # => "cd"
str[first...last]      #firstとlastバイトの隙間にあるバイト
'abcd'[ 2 ... 3] # => "c"

str[substr]           #substrにマッチする最初の部分文字列を返す。
substr = "bar"
result = "foobar"[substr] #一致した文字列を新しく作って返す。substrには正規表現もいける。
p result                  # => "bar"

#要は同じことだけど
str[regexp]           #regexp にマッチする最初の部分文字列を返す。
str[regexp, nth]      #regexp にマッチするnth番目の部分文字列を返す。
p "foobar"[/bar/]  # => "bar"
p $~.begin(0)      # => 3

#第2引数に数字を指定すると括弧にマッチした奴を取得できる。
p "def getcnt(line)"[ /def\s*(\w+)/, 1 ]   # => "getcnt"

str.slice(nth[, len]) #上のと同じ。
str.slice(substr)
str.slice(first..last)
str.slice(first...last)
str.slice(regexp[, nth])
 

文字列の複製

str.clone          # 同じ内容を持つ新しい文字列を返す。フリーズされた文字列を返す
str.dup            # 同じ内容を持つ新しい文字列を返す。Srting#newと等価

str.clear          #文字列の内容を削除して空にする

str.replace(other) #文字列の内容を other の内容で置き換えます。
s = "foo"
id = s.id
s.replace "bar"
p s             # => "bar"
p id == s.id    # => true

文字列の検索

str.include?(substr)      #strにsubstrが含まれるかどうか(bool)
str.index(pattern[, pos]) #部分文字列の探索を左端から右端に向かって行い、部分文字列の左端の位置を返す
#pos が負の場合、文字列の末尾から数えた位置から探索。
p "foobarfoobar".index("bar", 6)        # => 9
p "foobarfoobar".index("bar", -6)       # => 9

rindex(pattern[, pos])    #部分文字列の探索を右端から左端に向かって行います

# String#index の場合
p "foobar".index("bar", 2)    # => 3
#    bar   <- ここから探索を行う
#     bar  <- 右にずらしてここで見つかる

# String#rindex の場合
p "foobar".rindex("bar", -2)  # => 3
#    bar <- ここ(右端が末尾から 2 番目)ではなく
#      bar <- ここから探索を行う(左端が末尾から2番目)
#     bar  <- 左にずらしてここで見つかる

 

置換

str[substr]=val #最初に一致した部分をvalで置換

str.match(regexp[, pos])       #regexp.match(self[, pos]) と同じ


str.sub(pattern, replace)      #pattern にマッチする部分全てを replace で置き換える。(最初のみ)
str.sub!(pattern, replace)     #(元の変数を操作)

str.gsub(pattern, replace)     #pattern にマッチする部分全てを replace で置き換えます。
str.gsub!(pattern, replace)    #(元の変数を操作)
p 'abcabc'.gsub(/b/, '(\&)')   #=> "a(b)ca(b)c"
p 'abcabc'.gsub(/b/) {|s| s.upcase }  #=> "aBcaBc"
p 'abcabc'.gsub(/b/) { $&.upcase }    #=> "aBcaBc"

str.tr(search, replace)        #search を replace 文字列の対応する文字に置き換える。
str.tr!(search, replace)       #(元の変数を操作)
p "foo".tr('a-z', 'A-Z')
=> "FOO"

str.tr_s(search, replace)      #同一の文字の並びがあったらそれを 1 文字に圧縮します。
str.tr_s!(search, replace)     #(元の変数を操作)
p "foo".tr_s('a-z', 'A-Z')
=> "FO"

str.squeeze(str1)   #str1 に含まれる同一の文字の並びをひとつにまとめます。
p "112233445566778899".squeeze
=>"123456789"


str.delete(str1[, str2[, ... ]])     #文字列から str1 に含まれる文字を取り除く。引数はtr(1)形式 

p "123456789".delete("2-8", "^4-6")  #=> "14569"
p "123456789".delete("2378")         #=> "14569"


insert(nth, other)             #文字列の挿入
#str[nth, 0] = otherと同値

文字列の長さとか

str.length         #文字列のバイト数を返します。
str.size           #同上

str.count()          # 文字列中の文字の数を返す。引数はtr(1)形式 
p 'abcdefg'.count('c')               # => 1
p '123456789'.count('2378')          # => 4
p '123456789'.count('2-8', '^4-6')   # => 4
 

大文字小文字の変換

str.upcase         #大文字に
str.upcase!        #(元の変数を操作)

str.downcase       #小文字に
str.downcase!      #(元の変数を操作)

str.swapcase       #大文字小文字反転
str.swapcase!      #(元の変数を操作)

str.capitalize     #先頭を大文字に、その他を小文字に
str.capitalize!    #先頭を大文字に、その他を小文字に(元の変数を操作)

文字列の整形

str.center(width)  #width文字の中で中央寄せする
str.ljust(width)   #width文字の中で左寄せする
str.rjust(width)   #width文字の中で右寄せする

str.reverse        #文字列をひっくり返す。
str.reverse!       #(元の変数を操作)
 

改行コードとかの処理

str.strip              #先頭と末尾の空白文字を全て取り除きます。
str.strip!             #(元の変数を操作)

str.lstrip             #先頭の空白文字を取り除く。
str.lstrip!            #(元の変数を操作)

str.rstrip             #末尾の空白文字を取り除く。
str.rstrip!            #(元の変数を操作)

str.chop               #文字列の最後の文字を取り除く(終端が"\r\n"であれば2文字取り除く)
str.chop!              #(元の変数を操作)

str.chomp([rs])        #文字列の末尾から rs で指定する行区切りを取り除く。(改行を取り除く)
str.chomp!([rs])       #(元の変数を操作)

str.dump               #制御文字をエスケープ
puts "abc\r\n\f\x00\b10\\\"".dump  #=> "abc\r\n\f\000\01010\\\""

配列処理

str.split([separater[, limit]])  #separaterで分割して配列に格納

str.scan(regexp)    #正規表現 regexpで繰り返しマッチを行い、マッチした部分文字列の配列を返します
p "foobarbazfoobarbaz".scan(/ba./)
# => ["bar", "baz", "bar", "baz"]

str.unpack
 

ループ処理とか

str.each            #文字列中の各行に対して繰り返す
str.each_line       #同上
str.each_byte       #文字列中の各文字に対して繰り返す

str.next       #次の文字列を返します。
str.next!      #(元の変数を操作)
str.succ       #次の文字列を返します。
str.succ!      #(元の変数を操作)

p "aa".succ # => "ab"
p "99".succ # => "100"
p "a9".succ # => "b0"
p "Az".succ # => "Ba"

#a, b, c, ... z,aa, ... az, ..., za を出力します。
("a" .. "za").each do |str|
  puts str
end

型変換

str.to_i    #integerに変換
str.to_f    #floatに変換
str.hex     #16進に変換
str.oct     #8進に変換
str.sum     #チェックサムを計算
str.to_s    #自分自身を返す
str.to_str  #自分自身を返す

str.intern   #文字列に対応するシンボル値(Symbol)を返します。
str.to_sym   #同上
p "foo".intern.to_s == "foo"
=> true

その他

str.crypt(salt)    #saltでstrを暗号化

hoge =~ regexp #regexpにマッチするか
#組み込み変数 $~ にマッチに関する情報が設定される。

参考