Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介

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

# 目次
1.[Stringモジュールで遊んでみたシリーズ① -String.at ~ String.chunk の紹介](https://qiita.com/Alicesky2127/items/47fffc38711d7369beee)
2.[Stringモジュールで遊んでみたシリーズ② -String.codepoints ~ String.ends_with? の紹介](https://qiita.com/Alicesky2127/items/5db34c69993d35b8f3a7)
3.[Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介](https://qiita.com/Alicesky2127/items/37aa8e62e8e1d5fef3b6)
4.[Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介](https://qiita.com/Alicesky2127/items/e3fa2092a67cb9f6ec9c)
5.[Stringモジュールで遊んでみたシリーズ⑤ -String.next_grapheme_size ~ String.printable? の紹介](https://qiita.com/Alicesky2127/items/a315148e966c9f103a7c)
6.Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介(本記事)
7.[Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介](https://qiita.com/Alicesky2127/items/1a8e9c92fa758d0b1337)
8.[Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介](https://qiita.com/Alicesky2127/items/40e74cd622653796df5c)
9.[Stringモジュールで遊んでみたシリーズ⑨ -String.to_existing_atom ~ String.trim の紹介](https://qiita.com/Alicesky2127/items/9bf2b1effc3b68819ac2)
10.[Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介](https://qiita.com/Alicesky2127/items/b8310a3f5fc5b040ca78)

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

https://hexdocs.pm/elixir/String.html

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0


# String.replaceとは
`String.replace(subject, pattern, replacement, options \\ [])`は`subject`内の`pattern`を`replacement`に置き換えます。

## 例
```diff_elixir:iex
String.replace("a,b,c", ",", "-")
```
```
"a-b-c"
```

`global: false`のときは`pattern`が複数回登場しても最初の1回のみ置き換えが行われます。
```diff_elixir:iex
String.replace("a,b,c", ",", "-", global: false)
```
```
"a-b,c"
```

文字列リストを利用して`pattern`に対して無名関数による操作をした場合
※下記の例では、patternにヒットした"a"と"c"について、それぞれ2文字後のアルファベットに置換する操作が行われます
```diff_elixir:iex
String.replace("a,b,c", ["a", "c"], fn <<char>> -> <<char + 2>> end)
```
```
"c,b,e"
```


# String.replace_invalidとは
`String.replace_invalid(bytes, replacement \\ "�")`は、`bytes`内の無効なバイトを`replacement`に置き換えます。

## 例
```diff_elixir:iex
String.replace_invalid("asd" <> <<0xFF::8>>)
```
```
"asd�"
```

### 余談
バイトが無効な文字列かどうかは`String.valid?`で確認することができます
```diff_elixir:iex
String.valid?("asd" <> <<0xFF::8>>)
```
```
false
```

# String.replace_leadingとは
`String.replace_leading(string, match, replacement)`は`subject`内の前方一致検索を行い、`match`にヒットした部分を`replacement`に置き換えます。

## 例
```diff_elixir:iex
String.replace_leading("hello world", "hello ", "")
```
```
"world"
```

前方一致検索なので先頭にヒットしなければ置換されません
```diff_elixir:iex
String.replace_leading("hey hello world", "hello ", "")
```
```
"hey hello world"
```

`subject`の先頭から`match`にヒットする要素が2回連続する場合全て置換されます
```diff_elixir:iex
String.replace_leading("hello hello world", "hello ", "")
```
```
"world"
```

# String.replace_prefixとは
`String.replace_prefix(string, match, replacement)`は`string`内の前方一致検索を行い`match`にヒットした場合その部分を`replacement`に置き換えます。

## 例
```diff_elixir:iex
String.replace_leading("hello world", "hello ", "")
```
```
"world"
```

前方一致検索なので先頭にヒットしなければ置換されません
```diff_elixir:iex
String.replace_prefix("hey hello world", "hello ", "")
```
```
"hey hello world"
```

`string`の先頭から`match`にヒットする要素が2回連続する場合先頭の1回だけ置換されます
```diff_elixir:iex
String.replace_prefix("hello hello world", "hello ", "")
```
```
"hello world"
```



# String.replace_suffixとは
`String.replace_suffix(string, match, replacement)`は`string`内の後方一致検索を行い`match`にヒットした場合その部分を`replacement`に置き換えます。

## 例
```diff_elixir:iex
String.replace_suffix("hello world", " world", "")
```
```
"hello"
```

後方一致検索なので末尾にヒットしなければ置換されません
```diff_elixir:iex
String.replace_suffix("hello world thanks", " world", "")
```
```
"hello world thanks"
```

`string`の末尾から`match`にヒットする要素が2回連続する場合末尾の1回だけ置換されます
```diff_elixir:iex
String.replace_suffix("hello world world", " world", "")
```
```
"hello world"
```


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

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

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

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




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


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！