文字列 メモ

v0.6.x と v0.7.0 の間に仕様が変わった部分が多い.

characterとsrting

Juliaでは,文字列の種類にcharacterとsrtingがある.

  • character
    単一の文字をcharacterとしている.シングルクォートで表す.
    julia> typeof('A')
    Char
    julia> typeof('あ')
    Char
    改行(\n)や,タブ(\t)も文字として扱われる.
    julia> typeof('\n')
    Char
  • string
    文字列の並び(Vector{UInt8}).ダブルクォート""で囲われる.
    julia> typeof("A")
    String
    複数行に跨がるときはダブルクォートを3つで囲む.
    julia> typeof("""Hello
           World
           """)
    String
    文字列が全てASCIIで表現できればASCIIStringになり,それ以外ならUTF8Stringになるらしい.
    これらの文字列はimmutableである.変更する場合はコピーするか置換するかで別の変数とする.
    また,s[n:m] のようにして文字列を抜き出すことができる.

文字列の結合,繰り返し

複数の文字列を結合するには * または string(arg1,arg2,arg3)を使う.

julia> "abc"*"def"
"abcdef"
julia> string("abc","de","f")
"abcdef

同じ文字配列の繰り返しは ^ で行う.

julia> "%d,"^5
"%d,%d,%d,%d,%d,"

上記のように,Juliaでの文字列の結合・繰り返しは数学の演算に近い.

ディレクトリやファイルを繋ぐときは,joinかjoinpathが良い.
JuliaのjoinはPythonと少し違う.joinpathがPythonでいうjoin,MATLABでいうfullfile.

julia> join(["dirname","filename"],"/")
"dirname/filename"

文字列の長さ

lengthまたはlastindex(以前はendof)で長さを取得する.ただし,lastindexは複数バイトで表現されるUnicode文字を含むときは注意が必要.
lengthが無難だと思う.

julia> length("COMME des GARÇONS")
17
julia> lastindex("COMME des GARÇONS") # "Ç"が2つとしてカウントされる
18

文字列の検索・検出・抽出

  • search → findfirst, findlast, findnext
    searchはなくなりfindfirst, findlast, findnextになった.
    julia> findfirst("a","abad")
    1:1
    julia> findlast("a","abad")
    3:3
    julia> findnext("a","abad",1) # 3番目の引数は開始位置
    1:1
    julia> findnext("a","abad",2)
    3:3
    julia> findnext("a","abad",3)
    3:3
    julia> findnext("a","abad",4)
    
    julia> findnext("a","abad",4) === nothing
    true
  • contains → occursin
    含まれているかどうか,true(=1)かfalse(=0)で返す.
    . をつけて配列の全要素に対して判定すると便利.
    julia> s = ["COMME","des","GARÇONS"]
    3-element Array{String,1}:
     "COMME"
     "des"
     "GARÇONS"
    julia> occursin.("O",s)
    3-element BitArray{1}:
      true
     false
      true
  • occursin (正規表現)
    occursinは正規表現にも対応しているが,配列のパターンマッチを行う場合,上記と同様の"."によるブロードキャストができない.
    julia> s = ["COMME","des","GARÇONS"]
    3-element Array{String,1}:
     "COMME"
     "des"
     "GARÇONS"
    julia> occursin.(r"O",s)
    ERROR: MethodError: no method matching length(::Regex)
    正規表現では,map(またはbroadcast)を使う必要がある点に注意.
    julia> map(x->occursin(r"O",x),s)
    3-element Array{Bool,1}:
      true
     false
      true
    julia> broadcast(x->occursin(r"O",x),s)
    3-element BitArray{1}:
      true
     false
      true
  • match, ismatch,
    正規表現を使って,パターンマッチを行う.正規表現は,r"hogehoge"のように指定する.
    ismatchはなくなってoccursinに.
    # match はマッチした部分を返す
    julia> m = match(r"[A-Z]{5}\s[a-z]{3}\s\p{Lu}{7}\s[a-z]{5}\s\d{4}$","COMME des GARÇONS since 1969")
    RegexMatch("COMME des GARÇONS since 1969")
    この戻り値mはRegexMatchという構造体になり,正規表現の部分に()で括ると,それぞれを抽出できる.
    (\d{n})のように正規表現で数値として抽出しても,Stringで抽出されることに注意.
    # スペースとsince以外の部分を()で括る
    julia> m = match(r"([A-Z]{5}\s[a-z]{3}\s\p{Lu}{7})\s[a-z]{5}\s(\d{4})$","COMME des GARÇONS since 1969")
    RegexMatch("COMME des GARÇONS since 1969", 1="COMME des GARÇONS", 2="1969")  
    #capturesをそれぞれを表示 
    julia> Printf.@printf("Wikipediaによれば%sは%s年設立", m.captures[1], m.captures[2])
    WikipediaによればCOMME des GARÇONSは1969年設立

文字列の置換

置換はreplaceで行う.正規表現でも使える.

julia> replace("COMME des GARÇONS",r"[A-Z]{5}" => "")
" des GARÇONS"

大文字,小文字の変換もできる,

julia> replace("COMME des GARÇONS","O" => lowercase) # Oを小文字に
"CoMME des GARÇoNS"
julia> replace("COMME des GARÇONS",r"[a-z]" => uppercase) # 小文字を大文字に
"COMME DES GARÇONS"

Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-08-31 (Fri) 15:47:12 (201d)