Juliaで学ぶプログラミング入門 文字列/ String Char Substring

# Char型とStrig型

Char型とString型は異なる型です。Char型は1文字を表します。String型は複数の文字からなる文字列を表します。


```julia
julia> c = 'a'
'a'
julia> typeof(c)
Char

julia> s = "abc"
"abc"
julia> typeof(s)
String

```
Char型の値は1文字で、String型の値は複数の文字からなる文字列です。Char型とString型は異なる型なので、演算子や関数で扱う際には型を確認して適切なものを使いましょう。

# Substring型とString型
SubstringとStringは型判断として同一ではありません。Substringとは文字列の一部を指します。一方、Stringとは文字列全体を指します。
```julia
s = s = "Hello, world!"
sub = substring(s, 1, 5)
println(sub) #"Hello"
println(typeof(sub) ) #SubString{String}

```
Substring型はメモリを省くなどの効果を目的に目的のSrting文字列をコピーせず、そのかわりにその元となる文字列からの抜き出す範囲などを記憶する内部処理をしています。

# 文字列の操作

## 文字列の結合
文字列を結合するには*演算子を使用します。

```julia
println("hello," * "Mr.Lawrence") # "hello,Mr.Lawrence"
```

## 文字列に変数を埋め込む
一般にフォーマット文字列などと言われているものです。

```julia
s = "hello,"
println("$s Mr.Lawrence") # "hello, Mr.Lawrence"
```
上の例では変数sにhello,を代入しその上で ,Mr.Lawrenceの直前の文字列の中に入れました。


## 文字列の抜き出し
適用するキャラクターの種類によって使い分けましょう。

## Asciiコードの場合

文字の位置を[start:end]の形で示すことで抜き出すことができます。

```julia
str = "hello, My Mother."
println(str[7:end]) # My Mother.
```

## UTF-8の場合
抜き出す前文字列[start:end]の形で示すとエラーが出ます。

### [start:end]では文字位置指定にならない
```julia
str = "さようならこんにちは"
println(str[5:end])
# StringIndexError: invalid index [5], valid nearby indices [4]=>'よ', [7]=>'う'
```
あるいは　以下のようになります。
```julia
str = "さようならこんにちは"
println(str[1:4])
# さよ
```
上記はstrの１番めから４番目までの文字列を抜き出すつもり（＝「さような」）で入力しました
ところが「さよ」しか抜き出されませんでした。

理由は位置していがバイト指定のためです。最初から何バイト目を抜き出すかを指定しています。

このため「何文字目かを指定したい」この方法は使えません。
以下の方法などがあります。

### 文字位置指定する方法


#### Charを使う
char型に変換するCharを利用します
```julia
str = "さようならこんにちは"
println(Char[str...][1:4])
# Vector{Char} ["さ", "よ", "う", "な"]
```

#### splitを使う
区切り文字を""で指定することで１文字単位になることを利用します。
```julia
str = "さようならこんにちは"
println(split(str, "")[1:4])
# SubString{String}["さ", "よ", "う", "な"]
```
なお、上記の場合Substring型になります。

#### nextindexを使う
文字配列の次のバイト位置を示すnextindex(nextind)をを利用します。
```julia
str = "さようならこんにちは"
println([str[index] for index in nextind.(str, 0, 1:length(str))][1:4])
# Vector{Char} ["さ", "よ", "う", "な"]
```


#### append!を使う
append!で配列を作るとchar単位に分けられてしまいます。これを使うこともできます。(なお、push!は文字列単位になります）
```julia
str = "さようならこんにちは"
str_ary=[]
append!(str_ary,str) #append!を利用するとcher単位で切り分けられる
println(str_ary[1:4])
```


### 切り抜き文字を結合する
上記では分割のままですので必要に応じてつなげます。

```julia
join(["さ", "よ", "う", "な"]) # "さような" 
```

## Substring型について
Substring型は文字列から抜き出すと書きました。では元の文字列を変化させるとどうなるのでしょうか。

以下挙動を示します。

```julia
str = "こんにちはさようなら"
extract1 = str[4:10] # 簡潔に書きたいのでバイト位置指定で
# "んにち"
typeof(extract1) # 抜き出してもString型になる
# String

extract2 =SubString(str, 4, 10)
# "んにち"
typeof(extract2)
# SubString{String}
``` 
strをString型、extract2 Substring型としました。
引き続きコマンドを入力します。

```julia
str = "" # "こんにちはさようなら"　=> ""　にする
print(extract2)
# "んにち"

typeof(extract2)
# SubString{String}
```
型も中身も変化しないようです。


## 参考図書
[１から始めるプログラミング](https://amzn.to/3HHR7Yv)
<a href="https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-1&linkCode=li3&tag=buzz06-22&linkId=8f7deba521f52f812d35ecdbe756cc10&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=433902905X&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=433902905X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Juliaプログラミングクックブック](https://amzn.to/3PFfb0a)
<a href="https://www.amazon.co.jp/Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%A7-Bogumi%C5%82-Kami%C5%84ski/dp/4873118891?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-2&linkCode=li3&tag=buzz06-22&linkId=4e34b4b620932164412ec18acff914a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118891&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4873118891" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[天才プログラマー タンメイが教える Julia超入門](https://amzn.to/3FJRpeW)
<a href="https://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E3%82%BF%E3%83%B3%E3%83%A1%E3%82%A4%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Julia%E8%B6%85%E5%85%A5%E9%96%80-Tanmay-Bakshi/dp/4807920219?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-10&linkCode=li3&tag=buzz06-22&linkId=bf79aa67b5c5956c8fd26f9436401dc6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4807920219&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4807920219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />