Erlang の string モジュールを一通り試す - その2
OTP 20.0 で string モジュールに多くの関数が追加されていたのに、最近気がついた。一通り試そうと思う。
string モジュールのおさらいをしたい人は下記の記事へ
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のデフォルトはleading
。leading
は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"
他の記事へ