Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介

こんにちは！
プログラミング未経験文系出身、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 の紹介](https://qiita.com/Alicesky2127/items/94a77afe270587ed21a9)
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? の紹介(本記事)

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

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

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

# String.trim_leadingとは(trim_leading/1)
`String.trim_leading(string)`は`string`の先頭にあるUnicode空白にあたる文字を全て削除した文字列を返します。
## 例
下記は以下の空白文字を含んでいる
- `\n` LF(Line Feed)のエスケープシーケンス
- `\r` CR(Carriage return)エスケープシーケンス
- ` ` 半角スペース

先頭の`\n`のみが削除される
```diff_elixir:iex
String.trim_leading("\n abc\r  ")
```
```
"abc\r  "
```

# String.trim_leadingとは(trim_leading/2)
`String.trim(string, to_trim)`は`string`の先頭にある`to_trim`を全て削除した文字列を返します。

## 例
先頭の`"a"`のみが削除されるため`"  abc  a"`だけが残る
```diff_elixir:iex
String.trim_leading("a  abc  a", "a")
```
```
"  abc  a"
```


# String.trim_trailingとは(trim_trailing/1)
`String.trim_trailing(string)`は`string`の末尾にあるUnicode空白にあたる文字を全て削除した文字列を返します。
## 例
下記は以下の空白文字を含んでいる
- `\n` LF(Line Feed)のエスケープシーケンス
- `\r` CR(Carriage return)エスケープシーケンス
- ` ` 半角スペース

末尾の`\r  `のみが削除される
```diff_elixir:iex
String.trim_leading("\n abc\r  ")
```
```
"\n abc"
```


# String.trim_trailingとは(trim_trailing/2)
`String.trim(string, to_trim)`は`string`の末尾にある`to_trim`を全て削除した文字列を返します。

## 例
末尾の`"a"`のみが削除されるため`"a  abc  "`だけが残る
```diff_elixir:iex
  String.trim_trailing("a  abc  a", "a")
```
```
"a  abc  "
```



# String.upcaseとは
`String.upcase(string, mode \\ :default)`は`string`の全ての文字を`mode`に従って大文字に変換します。

## 例
```diff_elixir:iex
String.upcase("abcd")
```
```
"ABCD"
```

## 類似の関数との比較
全て小文字に変換したい場合 → [`String.downcase`](https://qiita.com/Alicesky2127/items/5db34c69993d35b8f3a7#stringdowncase%E3%81%A8%E3%81%AF)

先頭の1文字だけ大文字に変換したい場合 → [`String.capitalize`](https://qiita.com/Alicesky2127/items/47fffc38711d7369beee#stringcapitalize%E3%81%A8%E3%81%AF
)

# String.valid?とは
`String.valid?(string, algorithm \\ :default)`は`string`が有効な文字列か否かをチェックします。

## 例
```diff_elixir:iex
String.valid?("a")
```
```
true
```

## 類似の関数との比較
無効な文字列を置換したい場合 → [`String.replace_invalid`](https://qiita.com/Alicesky2127/items/94a77afe270587ed21a9#stringreplace_invalid%E3%81%A8%E3%81%AF)

### 補足：無効な文字列とは
下記の`<<0xFF::8>>`はbit長を明示したバイナリの書き方です[^1]

つまり、`0xFF`(←16進数表記。10進数表記で255。2進数表記で11111111)を`8ビット長`(=1バイト長)のバイナリで示すという意味です。

Elixirの文字列はUTF-8エンコードされたバイナリです。

しかし`0xFF`はUTF-8で示せる範囲に含まれていません。[^2][^3]

したがって、`<<0xFF::8>>`は無効な文字列であり、`<<0xFF::8>>`を文字列結合した`"asd" <> <<0xFF::8>>`も無効な文字列です。

```diff_elixir:iex
String.valid?("asd" <> <<0xFF::8>>) 
```
```
false
```


# ～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

[^1]:https://qiita.com/kikuyuta/items/e200a6208013f38333de#%E3%83%93%E3%83%83%E3%83%88%E5%88%97-bitstring

[^2]: https://qiita.com/nekotadon/items/5d0f0fc7c58d088eec99#utf-8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

[^3]: https://ja.wikipedia.org/wiki/UTF-8


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


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