Char型とStrig型
Char型とString型は異なる型です。Char型は1文字を表します。String型は複数の文字からなる文字列を表します。
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とは文字列全体を指します。
s = s = "Hello, world!"
sub = substring(s, 1, 5)
println(sub) #"Hello"
println(typeof(sub) ) #SubString{String}
Substring型はメモリを省くなどの効果を目的に目的のSrting文字列をコピーせず、そのかわりにその元となる文字列からの抜き出す範囲などを記憶する内部処理をしています。
文字列の操作
文字列の結合
文字列を結合するには*演算子を使用します。
println("hello," * "Mr.Lawrence") # "hello,Mr.Lawrence"
文字列に変数を埋め込む
一般にフォーマット文字列などと言われているものです。
s = "hello,"
println("$s Mr.Lawrence") # "hello, Mr.Lawrence"
上の例では変数sにhello,を代入しその上で ,Mr.Lawrenceの直前の文字列の中に入れました。
文字列の抜き出し
適用するキャラクターの種類によって使い分けましょう。
Asciiコードの場合
文字の位置を[start:end]の形で示すことで抜き出すことができます。
str = "hello, My Mother."
println(str[7:end]) # My Mother.
UTF-8の場合
抜き出す前文字列[start:end]の形で示すとエラーが出ます。
[start:end]では文字位置指定にならない
str = "さようならこんにちは"
println(str[5:end])
# StringIndexError: invalid index [5], valid nearby indices [4]=>'よ', [7]=>'う'
あるいは 以下のようになります。
str = "さようならこんにちは"
println(str[1:4])
# さよ
上記はstrの1番めから4番目までの文字列を抜き出すつもり(=「さような」)で入力しました
ところが「さよ」しか抜き出されませんでした。
理由は位置していがバイト指定のためです。最初から何バイト目を抜き出すかを指定しています。
このため「何文字目かを指定したい」この方法は使えません。
以下の方法などがあります。
文字位置指定する方法
Charを使う
char型に変換するCharを利用します
str = "さようならこんにちは"
println(Char[str...][1:4])
# Vector{Char} ["さ", "よ", "う", "な"]
splitを使う
区切り文字を""で指定することで1文字単位になることを利用します。
str = "さようならこんにちは"
println(split(str, "")[1:4])
# SubString{String}["さ", "よ", "う", "な"]
なお、上記の場合Substring型になります。
nextindexを使う
文字配列の次のバイト位置を示すnextindex(nextind)をを利用します。
str = "さようならこんにちは"
println([str[index] for index in nextind.(str, 0, 1:length(str))][1:4])
# Vector{Char} ["さ", "よ", "う", "な"]
append!を使う
append!で配列を作るとchar単位に分けられてしまいます。これを使うこともできます。(なお、push!は文字列単位になります)
str = "さようならこんにちは"
str_ary=[]
append!(str_ary,str) #append!を利用するとcher単位で切り分けられる
println(str_ary[1:4])
切り抜き文字を結合する
上記では分割のままですので必要に応じてつなげます。
join(["さ", "よ", "う", "な"]) # "さような"
Substring型について
Substring型は文字列から抜き出すと書きました。では元の文字列を変化させるとどうなるのでしょうか。
以下挙動を示します。
str = "こんにちはさようなら"
extract1 = str[4:10] # 簡潔に書きたいのでバイト位置指定で
# "んにち"
typeof(extract1) # 抜き出してもString型になる
# String
extract2 =SubString(str, 4, 10)
# "んにち"
typeof(extract2)
# SubString{String}
strをString型、extract2 Substring型としました。
引き続きコマンドを入力します。
str = "" # "こんにちはさようなら" => "" にする
print(extract2)
# "んにち"
typeof(extract2)
# SubString{String}
型も中身も変化しないようです。