こんにちは!じゃいごテックのあつしです。
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 メソッドで アルファベットの大文字小文字変換が出来る