9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 17

Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介

Last updated at Posted at 2024-12-12

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はStringモジュールについて学んだことをまとめます。

目次

1.Stringモジュールで遊んでみたシリーズ① -String.at ~ String.chunk の紹介
2.Stringモジュールで遊んでみたシリーズ② -String.codepoints ~ String.ends_with? の紹介
3.Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介
4.Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介
5.Stringモジュールで遊んでみたシリーズ⑤ -String.next_grapheme_size ~ String.printable? の紹介
6.Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介
7.Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介(本記事)
8.Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介
9.Stringモジュールで遊んでみたシリーズ⑨ -String.to_existing_atom ~ String.trim の紹介
10.Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介

目的

Stringモジュールに含まれる関数を触って機能を理解したい

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

String.replace_trailingとは

String.replace_trailing(string, match, replacement)string内の後方一致検索を行い、matchにヒットした部分をreplacementに置き換えます。

iex
String.replace_trailing("hello world", " world", "")
"hello"

後方一致検索なので末尾にヒットしなければ置換されません

iex
String.replace_trailing("hello world thanks", " world", "")
"hello world thanks"

subjectの末尾からmatchにヒットする要素が2回連続する場合全て置換されます

iex
String.replace_trailing("hello world world", " world", "")
"hello"

文字列を置換するString関数のまとめ

文字列を置換するString関数の差分をまとめると下記の表の通りです

関数名 検索方法 連続ヒット時
replace 部分一致 全て置換
replace_leading 前方一致 全て置換
replace_prefix 前方一致 最初にヒットした部分のみ置換
replace_suffix 後方一致 最初にヒットした部分のみ置換
replace_trailing 後方一致 全て置換

1つ前の記事もご参照ください

String.reverseとは

String.reverse(string)stringを逆順にして返します

iex
String.reverse("abcd")
"dcba"
iex
String.reverse("いろはにほへと ちりぬるを")
"をるぬりち とへほにはろい"

String.sliceとは(slice/2)

String.slice(string, range)stringからrangeぶんの部分文字列を返します。

iex
String.slice("elixir", 0..2)
"eli"

rangestringの末尾を超える場合。
stringの末尾までを取り出します

iex
String.slice("elixir", 1..10)
"lixir"

rangeが負の数の場合
stringの末尾からインデックスを数えます

iex
String.slice("elixir", -4..-3)
"ix"

rangestart..stopとしたとき

rangestart..stopとしたとき、start > stopの範囲の場合ではステップ数ごとに文字を取り出します。
ステップ数を//で書かないとwarningが出ます

iex
String.slice("いろはにほへと", 1..-2//1) 
# インデックスが1(この場合"ろ")をstartとする
# インデックスが-1(この場合"へ")をendとする
# //1なのでステップ数が1。つまり1文字ごとに取り出す
"ろはにほへ"

ステップ数を変更した場合

iex
String.slice("いろはにほへと", 1..-2//2)
# インデックスが1(この場合"ろ")をstartとする
# インデックスが-1(この場合"へ")をendとする
# //1なのでステップ数が2。つまり2文字ごとに取り出す
"ろにへ"

String.sliceとは(slice/3)

String.slice(string, start, length)は書記素ベースでstartからlengthぶんの部分文字列を返します。

※書記素ベースではなくバイト数ベースで取り出したい場合はString.byte_sliceを使用のこと↓

iex
String.slice("elixir", 1, 3)
"lix"

取り出す範囲がstringの末尾を超える場合。
startからstringの末尾までを取り出します

iex
String.slice("elixir", 1, 10)
"lixir"

startが文字列の長さより大きい場合。
空の文字列を返します

iex
String.slice("elixir", 10, 1)
""

startが負の数の場合。
stringの末尾からインデックスを数えます

iex
String.slice("elixir", -2, 1)
"i"
iex
String.slice("elixir", -2, 3)
"ir"

startが負の数かつ文字列の長さより大きい場合。
start = 0の時と同様の扱いになります

iex
String.slice("elixir", -10, 1)
"e"

String.splitとは(split/1)

下記をご参照ください

String.splitとは(split/3)

下記をご参照ください

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?