String.replace/3 (Elixir)

この記事は [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) 12日目です。
前回は[NimbleCSVのご紹介(Elixir)](https://qiita.com/torifukukaiou/items/9e9e28411d6a7d134a11)でした。

---

# はじめに
- [Elixir](https://elixir-lang.org/) 楽しんでいますか！
- [プログラミングElixir 第2版](https://www.ohmsha.co.jp/book/9784274226373/) 発売中!
![EoohLj8VgAAvhTJ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/4d81dc06-32ee-9d1e-546e-21288f64e080.jpeg)

# String.replace/3
- を紹介します
- `IEx`に聞いてみましょう

```elixir
$ iex

iex> h String.replace/3

           def replace(subject, pattern, replacement, options \\ [])            

Returns a new string created by replacing occurrences of pattern in subject
with replacement.

The subject is always a string.

The pattern may be a string, a regular expression, or a compiled pattern.

The replacement may be a string or a function that receives the matched pattern
and must return the replacement as a string or iodata.

By default it replaces all occurrences but this behaviour can be controlled
through the :global option; see the "Options" section below.

## Options

  • :global - (boolean) if true, all occurrences of pattern are replaced
    with replacement, otherwise only the first occurrence is replaced. Defaults
    to true

## Examples

    iex> String.replace("a,b,c", ",", "-")
    "a-b-c"
    
    iex> String.replace("a,b,c", ",", "-", global: false)
    "a-b,c"

The pattern may also be a list of strings and the replacement may also be a
function that receives the matches:

    iex> String.replace("a,b,c", ["a", "c"], fn <<char>> -> <<char + 1>> end)
    "b,b,d"

When the pattern is a regular expression, one can give \N or \g{N} in the
replacement string to access a specific capture in the regular expression:

    iex> String.replace("a,b,c", ~r/,(.)/, ",\\1\\g{1}")
    "a,bb,cc"

Notice we had to escape the backslash escape character (i.e., we used \N
instead of just \N to escape the backslash; same thing for \g{N}). By giving
\0, one can inject the whole match in the replacement string.

A compiled pattern can also be given:

    iex> pattern = :binary.compile_pattern(",")
    iex> String.replace("a,b,c", pattern, "[]")
    "a[]b[]c"

When an empty string is provided as a pattern, the function will treat it as an
implicit empty string between each grapheme and the string will be
interspersed. If an empty string is provided as replacement the subject will be
returned:

    iex> String.replace("ELIXIR", "", ".")
    ".E.L.I.X.I.R."
    
    iex> String.replace("ELIXIR", "", "")
    "ELIXIR"
```

- わかりやすいですね！

# どんなとき使うの？
- こんなことがありました
- markdownで書いた表がズレているのです
- 56番 :point_down::point_down_tone1::point_down_tone2::point_down_tone3::point_down_tone4::point_down_tone5:
- 記事のタイトルに`|`が含まれていて、それが表の区切りと区別がつかないのですね
- [Elixir](https://elixir-lang.org/)は[Pipe Operator |>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2) が人気がありますので、`|`は記事タイトルで使われることはよくありそうです

![スクリーンショット 2020-12-12 2.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/c32ec52c-6e33-f580-9438-809f3e89a49f.png)

```
|56|NeosVR＋Elixirで気軽にVR WebSocketプログラミング（VR |> AR投影アプリの裏側）<br>@piacerex|2020-12-11|3|
|57|実験: レガシーなImage ProcessingをElixirのパイプで書いてみる<br>@ShozF|2020-12-09|3|
...
```

## String.replace/3の出番です！

```elixir
iex> String.replace("NeosVR＋Elixirで気軽にVR WebSocketプログラミング（VR |> AR投影アプリの裏側）", "|", "&#124;")
"NeosVR＋Elixirで気軽にVR WebSocketプログラミング（VR &#124;> AR投影アプリの裏側）"
```

- `|`が`&#124;`に置きかわっていますね！

![スクリーンショット 2020-12-12 2.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/2aa1a765-adf2-b871-a8c5-519ff8dd613a.png)

:tada::tada::tada: (表がいい感じになりましたね！）

- エスケープは、@takashisiteさんの[Markdownのtable記述でのエスケープ](https://qiita.com/takashisite/items/f3000d46d39a61930dc5)を参考にしました
    - ありがとうございます！ 
- 令和二年なのにいまだにRaspberry Pi 2を使っていてその上で動いている[Nerves](https://www.nerves-project.org/)アプリが自動更新している[【毎日自動更新】QiitaのElixir LGTMランキング！](https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd)で表がおかしくなる問題は以前からありました
    - おなじように`|`をタイトルに含んでいると発生するわけです
    - たとえば、[マイブーム |> if(do: "Yes", else: "No") [Elixir]](https://qiita.com/torifukukaiou/items/937a0e5ba7f393e00793)という私の記事なので、まあいいやと**見て見ぬ振り**をしていました
    - @piacerex さんの記事なのでこれを機に対応してみました
    - そしてそれを[アドベントカレンダーネタ](https://qiita.com/piacerex/items/15b21f39c228a95d2bda)にしてみました
        - [思った以上に気楽にやっていけるコツ](https://qiita.com/piacerex/items/15b21f39c228a95d2bda#%E6%80%9D%E3%81%A3%E3%81%9F%E4%BB%A5%E4%B8%8A%E3%81%AB%E6%B0%97%E6%A5%BD%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84)

# Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:
- [Elixir](https://elixir-lang.org/)のわからないことは[Elixir](https://elixir-lang.org/) (`IEx`)に聞くと教えてもらえる
- ネタはそのへんに転がっているので、[Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) **完走できる！**（はず)
    - @mnishiguchi さん、たすきしっかりつなぎますのでよろしくお願いします :lgtm::bow::bow::bow::bow::bow::bow::bow::bow::bow::bow::lgtm: 
- Enjoy [Elixir](https://elixir-lang.org/)!!!