無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

Erlang の string モジュールを一通り試す - その2

OTP 20.0 で string モジュールに多くの関数が追加されていたのに、最近気がついた。一通り試そうと思う。

string モジュールのおさらいをしたい人は下記の記事へ

stacktrace.hatenablog.jp

next_codepoint/1 関数

next_codepoint(String :: unicode:chardata()) ->
                  maybe_improper_list(char(), unicode:chardata()) |
                  {error, unicode:chardata()}

String の最初のコードポイントと、残りのStringを末尾(Tail)として返す。 Stringが空の場合は空のリストを返し、次のバイトが無効な場合は{error、String}タプルを返す。

Example:

> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
[101|<<"̊fg"/utf8>>]
> string:next_codepoint("").
[]
> string:next_codepoint([]).
[]

next_grapheme/1 関数

next_grapheme(String :: unicode:chardata()) ->
                 maybe_improper_list(grapheme_cluster(),
                                     unicode:chardata()) |
                 {error, unicode:chardata()}

String で最初の書記素クラスタを返し、残りのStringを末尾(Tail)として返す。

Stringが空の場合は空のリストを返し、次のバイトが無効な場合は{error、String}タプルを返す。

Example:

> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
["e̊"|<<"fg">>]
> string:next_grapheme("").
[]
> string:next_grapheme([]).
[]

nth_lexeme/3 関数

nth_lexeme(String, N, SeparatorList) -> unicode:chardata()

Types

String = unicode:chardata()
N = integer() >= 0
SeparatorList = [grapheme_cluster()]

語彙素番号Nを文字列で返す。語彙素はSeparatorListの書記素クラスタによって区切られる。

Example:

> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
"ghi"

pad/2, pad/3, pad/4 関数

pad(String, Length) -> unicode:charlist()
pad(String, Length, Dir) -> unicode:charlist()
pad(String, Length, Dir, Char) -> unicode:charlist()

Types

String = unicode:chardata()
Length = integer()
Dir = direction() | both
Char = grapheme_cluster()

書記素クラスタ Char で文字列を長さ Length まで埋める。Dirはパティングを追加する場所を示し、先頭(leading)、末尾(trailing)、またはその両方(both)が指定できる。

デフォルトでは、Char は $\s で、Dir は trailing

Example

> string:pad(<<"He̊llö"/utf8>>, 8).                        
[<<"He̊llö"/utf8>>,32,32,32]
> [32].
" "
> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
'   He̊llö'
> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
' He̊llö  '
> string:pad("He̊llö", 8, both).                       
[" ","He̊llö"," ",32]
> string:pad("He̊llö", 9, both).
["  ","He̊llö","  "]
> string:pad(<<"He̊llö"/utf8>>, 8, leading, "!").         
[["!","!","!"],<<"He̊llö"/utf8>>]
> string:pad("He̊llö", 8, leading, "!").         
[["!","!","!"],"He̊llö"]
> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
'   He̊llö'
> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading, "!")]).
'!!!He̊llö'

prefix/2 関数

prefix(String :: unicode:chardata(), Prefix :: unicode:chardata()) ->
          nomatch | unicode:chardata()

PrefixがStringのプレフィックスである場合、それを削除してStringの残りを返し、そうでない場合はnomatchを返す。

Example:

> string:prefix(<<"prefix of string">>, "pre").
<<"fix of string">>
> string:prefix("prefix of string", "pre").    
"fix of string"
> string:prefix("pre", "prefix").          
nomatch
> string:prefix([<<"prefix of">>, "string"], "pre").     
[<<"fix of">>,"string"]

replace/3, replace/4 関数

replace(String, SearchPattern, Replacement) -> [unicode:chardata()]
replace(String, SearchPattern, Replacement, Where) -> [unicode:chardata()]

Types

String = SearchPattern = Replacement = unicode:chardata()
Where = direction() | all

StringのSearchPatternをReplaceに置き換える。 WhereのデフォルトはleadingleadingはStringの先頭の最初のSearchPatternを置き換える。trailingはStringの末尾方向から最初のSearchPatternを置き換える。 allを指定するとStringにあるすべてのSearchPatternを置き換える。

Example:

> string:replace("foo, bar, baz", "ba", "!!").
["foo, ","!!","r, baz"]
> string:replace("foo, bar, baz", "ba", "!!", trailing).
["foo, bar, ","!!","z"]
> string:replace("foo, bar, baz", "ba", "!!", all).     
["foo, ","!!","r, ","!!","z"]
> string:replace("foo, bar, baz", "ab", "!!").     
["foo, bar, baz"]

引数のStringはunicode:chardata()だが、戻り値はunicode:chardata()のリストになる。引数のStringにSearchPatternを含まない場合でも、引数のStringが戻り値と一致しないので気をつける。

reverse/1 関数

reverse(String :: unicode:chardata()) -> [grapheme_cluster()]

Stringの書記素クラスタのリストを逆順にして返す。

Example:

> string:reverse("あいうえお").          
"おえういあ"
> string:reverse("ÅÄÖ").          
"ÖÄÅ"

slice/2, slice/3 関数

slice(String, Start) -> Slice
slice(String, Start, Length) -> Slice

Types

String = unicode:chardata()
Start = integer() >= 0
Length = infinity | integer() >= 0
Slice = unicode:chardata()

開始位置(Start)から開始して、最大長(Length)の書記素クラスタの文字列(String)の部分文字列(Slice)を返す。

デフォルトのLengthは 無限(infinity)。

Example:

> string:slice("foo, bar, baz", 5).
"bar, baz"
> string:slice("foo, bar, baz", 5, 3).
"bar"
> string:slice(<<"He̊llö Wörld"/utf8>>, 4).
<<"ö Wörld"/utf8>>
>  string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,4).
"ö Wö"
> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,50).
"ö Wörld"

他の記事へ

stacktrace.hatenablog.jp

stacktrace.hatenablog.jp

stacktrace.hatenablog.jp