Ruby プログラミング

[Ruby] 文字列を操作するメソッド

string_2

こんにちは!じゃいごテックのあつしです。

paizaスキルチェックやスキルアップ問題集でよく使う文字列操作メソッドを集めてみましたのでご紹介します!

length、size メソッド

"対象文字列".length

文字列の文字数を返します。length、sizeのどちらを使っても同じ結果が得られます。
半角スペースや改行コードも1文字としてカウントされますので、改行コードはchompメソッドで除去しましょう。

p "jaigo engineer".length
# > 14

p "jaigo engineer\n".length
# > 15

p "jaigo engineer".size
# > 14

p "jaigo engineer\n".size
# > 15
lengthメソッドを使ってpaiza練習問題を解いてみる
文字列の文字数 (paizaランク D 相当)

※ paiza レベルアップ問題集 文字列処理メニューより

問題:

1 行で文字列 S が与えられるので、 S の文字数を出力してください。

入力される値

S

期待する出力

S の文字数を 1 行で出力してください。

条件

1 ≦ |S| ≦ 10000 ( |S| は、 S の文字数です。)

入力例1
paiza
出力例1
5

入力例2
rhaogioaghioagiofvkkkdkkwkwwkwkeiuh38198
出力例2
40

入力例3
IwantToBEcomeENgineer!!
出力例3
23

解答例:

# [解答例]
puts gets.chomp.length

count メソッド

"対象文字列".count("数える文字")

引数に与えた文字に含まれる文字の出現回数を数えます。

p "jaigo engineer".count("g")
# > 2
# g の数を返す

p "jaigo engineer".count("in") 
# > 4
# i と n の数を返す

"a-e"、"2-4" のように引数を与えると範囲内(aからe、2から4)の数を返します。
"^a-e"、"^2-4"とすると指定した文字以外の数を返します。

p "jaigo engineer".count("a-e")
# > 4
# a, b, c, d, e の数を返す

p "jaigo engineer".count("^a-e")
# > 10
# a, b, c, d, e 以外の数を返す

p "0123456789".count("2-4")
# > 3
# 2, 3, 4 の数を返す

p "0123456789".count("^2-4")
# > 7
# 2, 3, 4 以外の数を返す

scan メソッド

"対象文字列".scan("文字列")

"対象文字列".scan(/正規表現/)

対象文字列に対してマッチした文字列の配列を返します。

p "banana".scan("na")
# > ["na", "na"]
# 一致した "na" の配列を返す

p "banana".scan(/.a/) 
# > ["ba", "na", "na"]
# 正規表現パターンが一致した "ba" と "na" の配列を返す
# 正規表現の . は任意の1文字を表す

include? メソッド

"対象文字列".("判定したい文字")

文字列中に引数で指定した文字が含まれていれば true を返し、含まれていなければ false を返します。

p "jaigo engineer".include?("g")
# > true

p "jaigo engineer".include?("en")
# > true

p "jaigo engineer".include?("em")
# > false
include?メソッドを使ってpaiza練習問題を解いてみる
文字列の検索 (paizaランク D 相当)

※ paiza レベルアップ問題集 文字列処理メニューより

問題:

文字列 S , T が与えられるので、 T が S の部分文字列かどうかを判定してください。
なお、 S の部分文字列とは、 S の連続した 1 文字以上を取り出してできる文字列のことです。

入力される値

S
T

  • 1 行目に文字列 S , 2 行目に文字列 T が与えられます。

期待する出力

T が S の部分文字列ならば "YES" , そうでなければ "NO" を出力してください。

条件

  • S の各文字は、英数字または ',' です。
  • 1 ≦ |S| , |T| ≦ 100 ( |S| , |T| は、 それぞれ S , T の文字数です。)

入力例1
paiza
iza
出力例1
YES

入力例2
hellllllllllo
hellllllllllo
出力例2
YES

入力例3
abcdefg
abe
出力例3
NO

入力例4
qwreosbngsopbskobsokpsb
qwo
出力例4
NO

解答例:

# [解答例1]
S = gets.chomp
T = gets.chomp
if S.include?(T)
  puts "YES"
else
  puts "NO"
end

# [解答例2]
S, T = STDIN.read.split("\n")
puts S.include?(T) ? "YES" : "NO"

index メソッド

"対象文字列".index("探す文字",  検索開始位置)

文字を開始位置から右に向かって検索し、最初に見つかったインデックス(位置)を返し、見つからなかった場合は nil を返します。
開始位置(第2引数)の引数を省略すると左端から検索を開始します。

p "jaigo engineer".index("i")
# > 2

p "jaigo engineer".index("i", 3)
# > 9

p "jaigo engineer".index("en")
# > 6
indexメソッドを使ってpaiza練習問題を解いてみる
文字の検索 (paizaランク D 相当)

※ paiza レベルアップ問題集 文字列処理メニューより

問題:

文字列 S と文字 c が与えられるので、 c は S の何文字目に現れるかを調べてください。

入力される値

S
c

期待する出力

c は S の何文字目か現れるかを 1 行で出力してください。

条件

  • 1 ≦ |S| ≦ 10000 ( |S| は、 S の文字数です。)
  • c は 1 文字
  • c は S に 1 文字だけ含まれる。

入力例1
paiza
p
出力例1
1

入力例2
PAIZA
I
出力例2
3

入力例3
ABCDEFGHIJKLMNO!QRSTUVW&XYZ
!
出力例3
16

入力例4
1234567890
2
出力例4
2

解答例:

# [解答例1]
S = gets.chomp
c = gets.chomp
# インデックスは0から始まるので +1 する
puts S.index(c) + 1

# [解答例2]
S, c = STDIN.read.split("\n")
# インデックスは0から始まるので +1 する
puts S.index(c) + 1

reverse・reverse! メソッド

"対象文字列".revserse
"対象文字列".revserse!

文字列の左右を逆にして返します。 reverse! は元の文字列を左右逆に書き換えます。

word = "golf"
# 左右を逆にした文字列を返す
inverted_word = word.reverse
p word
# > "golf"
p inverted_word
# > "flog"

# 文字列を逆に書き換える
word.reverse!
p word
# > "flog"
reverseメソッドを使ってpaiza練習問題を解いてみる
回文判定 (paizaランク D 相当)

※ paiza レベルアップ問題集 文字列処理メニューより

問題:

文字列 S が与えられるので、 S が回文かどうかを判定してください。
なお、回文とは、前から読んでも後ろから読んでも同じ文字列になるような文字列のことをいいます。

入力される値

S

  • 文字列 S が 1 行で与えられます。

期待する出力

S が回文である場合 "YES" を、そうでない場合は "NO" を出力してください。

条件

  • S の各文字は、アルファベットの大文字または小文字
  • 1 ≦ |S| , |T| ≦ 1000 ( |S| は、 それぞれ S の文字数です。)

入力例1
1234321
出力例1
YES

入力例2
paizaazzap
出力例2
NO

入力例3
shinbunshi
出力例3
NO

入力例4
qpwoeirutyyturieowpq
出力例4
YES

解答例:

# [解答例]
S = gets.chomp

# 「S」 と 「S を逆にした文字列」が同じなら回文
if S == S.reverse
  puts "YES"
else
  puts "NO"
end

upcase、downcase、capitalize、swapcase メソッド

upcase・upcase! メソッド

"対象文字列".upcase
"対象文字列".upcase!

文字列中のアルファベットをすべて大文字にして返します。upcase! は同様の処理で元の文字列を書き換えます。

p "Ham Egg".upcase
# > "HAM EGG"

name = "Ham Egg"
name.upcase!
p name
# > "HAM EGG"
downcase・downcase! メソッド

"対象文字列".downcase
"対象文字列".downcase!

文字列中のアルファベットをすべて小文字にして返します。upcase! は同様の処理で元の文字列を書き換えます。

p "Fried Egg"..downcase
# > "fried egg"

name = "Fried Egg"
name.downcase!
p name
# > "fried egg"
capitalize・capitalize! メソッド

"対象文字列".capitalize
"対象文字列".capitalize!

文字列先頭の文字を大文字で残りは小文字にして返します。capitalize! は同様の処理で元の文字列を書き換えます。

p "oMeLette".capitalize
# > "Omelette"

name = "oMeLette"
name.capitalize!
p name
# > "Omelette"
swapcase・swapcase! メソッド

"対象文字列".swapcase
"対象文字列".swapcase!

大文字を小文字に、小文字を大文字にして返します。swapcase! は同様の処理で元の文字列を書き換えます。

p "Century Egg".swapcase
# > "cENTURY eGG"

name = "Century Egg"
name.swapcase!
p name
# > "cENTURY eGG"
swapcaseメソッドを使ってpaiza練習問題を解いてみる
大文字小文字の反転 (paizaランク D 相当)

※ paiza レベルアップ問題集 文字列処理メニューより

問題:

大文字と小文字のアルファベットが混ざった文字列 S が与えられます。
S の小文字を全て大文字に、大文字を全て小文字にした文字列を出力してください。

入力される値

S

  • 文字列 S が 1 行で与えられます。

期待する出力

S の小文字を全て大文字に、大文字を全て小文字にした文字列を 1 行で出力してください。

条件

  • S の各文字は、アルファベットの大文字または小文字
  • 1 ≦ |S| ≦ 100 ( |S| は、 S の文字数です。)

入力例1
Paiza
出力例1
pAIZA

入力例2
PiZzA
出力例2
pIzZa

入力例3
HelloEveryone
出力例3
hELLOeVERYONE

入力例4
CCppJavaJavaScriptRubyHTMLCSSSQL
出力例4
ccPPjAVAjAVAsCRIPTrUBYhtmlcsssql

解答例:

# [解答例]
puts gets.chomp.swapcase

今回のまとめ

  • length、size メソッドは文字数を数えることが出来る
  • count メソッドは指定した文字数を数えることが出来る
  • include? メソッドは部分一致の判定が出来る
  • index メソッドは最初の部分一致のインデックスを返す
  • reverse メソッドは文字の左右を逆にすることが出来る
  • upcase, downcase, capitalize, swapcase メソッドで アルファベットの大文字小文字変換が出来る
お疲れ様でした!これで文字列処理の問題は大体解けると思います!

【PR】Ruby学習でお世話になった本




【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-Ruby, プログラミング
-,

© 2024 じゃいごテック