Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

【Ruby】String#splitメソッドの引数の使い方で混乱したポイントをまとめた

はじめに

前提

まず前提として、この記事を書いているのは未経験からプログラミングに挑戦中の者になります。学習はフィヨルドブートキャンプに参加しながら取り組んでいて、現役のエンジニアの方からレビューをもらいながら進めています。

現在の学習状況は以下を随時更新しているので興味ある方はご覧ください。

hirano-vm4.hatenablog.com

そのため、学んだことを不定期に初学者向けにアウトプットしています。

今回はRubySilverの勉強をしていた際に、String#splitメソッドの引数で少し混乱した部分があったので、改めて確認しました。せっかく調べたことをブログ記事に残したいと思います。

String#splitの基本的な使い方

Rubysplitメソッドは、文字列を指定した区切り文字で分割するために使用されます。以下に基本的な使い方です。

str = "apple,banana,grape"

arr = str.split(",") # => ["apple", "banana", "grape"]

この例では、splitメソッドは,を区切り文字として文字列strを分割し、結果として配列arrが生成されます。区切り文字は文字列内の任意の箇所で指定できます。

また、splitメソッドには2つ目の引数を渡すこともできます。この引数は、分割する部分の最大数を制限します。

str = "apple,banana,grape,orange"

arr = str.split(",", 2) # => ["apple", "banana,grape,orange"]

この例では、,を区切り文字として文字列strを最大2つの部分に分割しています。

これが、Rubysplitメソッドの基本的な使い方です。

今回混乱した問題はこちら

"a b c d".split()

"a\nb\nc\nd".split(//)

"a\tb\tc\td".split()

"a b c d".split(//)

「このコードのうち、実行した結果が同じものを2つ選べ」という問題です。

普段コードを書いていて\tなどのタブ文字を使ってこなかったので、回答に迷ってしまいました。

引数なしの場合

引数を指定しない場合、splitメソッドは空白文字(スペース、タブ、改行など)で文字列を分割。連続する空白文字は一つの区切りと見なされる。

"a b c d".split() # => ["a", "b", "c", "d"]

"a\tb\tc\td".split() # => ["a", "b", "c", "d"]

引数に正規表現または文字列を指定する場合

引数に正規表現または文字列を指定すると、そのパターンにマッチする部分で文字列を分割。

  • //(空の正規表現)を引数にすると、文字列を1文字ずつの配列に分割。
  • 文字列を引数にすると、その文字列で分割します。
"a\nb\nc\nd".split(//) # => ["a", "\n", "b", "\n", "c", "\n", "d"]
"a b c d".split(//) # => ["a", " ", "b", " ", "c", " ", "d"]

紛らわしい挙動まとめ

  • 空白文字で分割したい場合、引数なしでsplitを使うと自動的に空白文字(スペース、タブ、改行)で文字列を分割してくれる。
  • 文字列を1文字ずつ分割したい場合、引数に空の正規表現//を使用。
  • 特定の文字やパターンで分割したい場合、その文字列や正規表現を引数に指定。

問題の回答

よってこの問題の回答は以下のようになります

irb(main):203:0> "a b c d".split()
=> ["a", "b", "c", "d"]

irb(main):204:0> "a\nb\nc\nd".split(//)
=> ["a", "\n", "b", "\n", "c", "\n", "d"]

irb(main):205:0> "a\tb\tc\td".split()
=> ["a", "b", "c", "d"]

irb(main):206:0> "a b c d".split(//)
=> ["a", " ", "b", " ", "c", " ", "d"]

さいごに

結構、RubySilverの問題はメソッドの動きをしっかり理解していないと解けない絶妙なところを突いてくるので良い勉強になります!

また混乱した部分があればアウトプットしていきたいと思います。