Rubyで文字列の先頭3文字を削除したい!ついでに抽出も覚えるslice

結論

「先頭の3文字を消したい」slice!メソッドを使う。

Rubyの破壊的メソッド「slice!」と「slice」は全くの別物!?

文字列の部分的抽出と部分的削除はsliceを使います。

素人ながらすいません。sliceは抽出で、slice!は削除と一旦認識しました。

sliceはString、Array、Hashに対応したメソッドのようです。が、今回私が必要としたのはStringに関してですので、今回はStringのみ取り上げます。

※「対応したメソッド」という表現は厳密には違うのでしょうか?このブログでは筆者の勝手な表現が多々ございます。ご了承ください。

きっかけ

今回なぜslice!を検索したか?
Windowsメモ帳で文章を書いてRubyで読み込んだときにBOM付きの「・」情報がついてしまうことがわかった。ほんとのところBOMがちゃんと何かわかっていないし、「・」がBOMかもわかっていない。前提としてもしこのままWindowsメモ帳で行くならこの「・」を消したかった。一時対応策としてメモ帳の1行目を空白行にしていました。
よって邪魔なものは「・\n」です。
「・」は半角黒点です。

(あとあと考えたら空白行作る意味はなかったかも笑。)

だからGoogleで「ruby 部分 文字列 削除」とかを調べました。

サンプル

文字列としてのイメージは「・\nおはようございます」です。
Winowsメモ帳の中身はこんな感じです。

test.txt↓

(空白行)
おはようございます。

「最初の3文字を消したい!」→部分文字列の削除→slice!ということです。

メソッド確認

【slice】

「ruby sliceメソッド」
https://www.sejuku.net/blog/14690#i-6

文字列は1文字ずつインデックス番号がついています。番号は0から始まります。
文字列は配列みたいに扱えるのです(みたいです)。

x = "Rubyはとっても楽しい!"
p x[3] #=> y

引数への指定は4つです。

  • インデックスで指定
  • 範囲で指定パターン1(開始位置指定)
  • 範囲で指定パターン2(インデックス番号範囲指定)
  • 正規表現で指定
  • 文字列で指定

試してみよう!

x = "Rubyはとっても楽しい!"
p x.slice(4)
p x.slice(1, 4)
p x.slice(1..3)
p x.slice(/楽/)
p x.slice("ef")

ちょっと注意すべきは2番目と3番目。
「x.slice(1, 4)」は開始位置インデックス番号1から4つ。
「x.slice(1..3)」はインデックス番号1からインデックス番号3。
ということ。

正規表現は基本的なものをまた今度覚えよう!うん、基本だけでも絶対抑えたほうがいいよ!すげー使える。

【slice!】

「ruby slice!」
https://uxmilk.jp/24040

引数への指定はsliceと同じ。

  • インデックスで指定
  • 範囲で指定パターン1(開始位置指定)
  • 範囲で指定パターン2(インデックス番号範囲指定)
  • 正規表現で指定
  • 文字列で指定

説明したい(書いたほうがいいだろう)けど、ちょっと疲れた。
引数はsliceと同じ。でも抽出されたものが削除されるってとこが違う。
(ほんとは「削除」って言葉も厳密には違うのかな?)
でも間違えても自分で書けて動くことを一旦優先します!プロの人!作った人!すいません!!

今回の目的・作業

今回の目的である「先頭3文字消したい!!」それなら、文字列指定か範囲指定のどっちもが使えそうだ。どれでもいいか。

最初の目的の文字列「・\nおはようございます」

test.txt↓

(空白行)
おはようございます。
#ruby↓

#パターン1
file = File.read("test.txt")
p file #文字列確認
#・\n削除
p file.slice!(0, 2)
p file

#パターン2
file = File.read("test.txt")
p file #文字列確認
#・\n削除
file.slice!(0, 2)
p file

文字列の部分的抽出と部分的削除はsliceで!!

動線思考

  • 「文字列の一部削除したいなー」
  • パターン1覚えている「削除ってslice!だよな」
  • パターン2検索できる(情報にアクセスできる)「ruby 文字列 部分 削除」とか。
  • 削除→slice!
  • str.slice!→「文字列の一部を削除せよ!」
  • 「どこを?」→引数指定
  • str.slice!(3)

こんな感じでしょうか?

スポンサーリンク
投稿記事
スポンサーリンク
OKE2GOU