結論
「先頭の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)
こんな感じでしょうか?