0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-04

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}

型も中身も変化しないようです。

参考図書

1から始めるプログラミング

Juliaプログラミングクックブック

天才プログラマー タンメイが教える Julia超入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?