Erlang の string モジュールの古い非推奨の関数から代わりの関数へ移行する - 後編
OTP 20.0 で string モジュールに多くの関数が追加されていたのに、最近気がついた。
string モジュールのおさらいをしたい人は下記の記事へ
下記のリストに記載した関数は古いAPIで非推奨になっている。それぞれ代わりになる新しいAPIがあるのでそちらへ移行する。 また、これらの古いAPIはLatin-1文字のリストでのみ機能することに注意する。
- cenre/2, centre/3 関数
- chars/2, chars/3 関数
- chr/2 関数
- concat/2 関数
- copies/2 関数
- cspan/2 関数
- join/2 関数
- left/2, left/3 関数
- len/1 関数
- rchr/2 関数
- right/2, right/3 関数
- rstr/2 関数
- span/2 関数
- str/2 関数
- strip/1, strip/2, strip/3 関数
- sub_string/2, sub_string3 関数
- substr/2, substr/3 関数
- sub_word/2, sub_word/3 関数
- to_lower/1, to_upper/1 関数
- tokens/2 関数
- words/1, words/2 関数
最初の10件は前編に、残りの11件は後編に分ける。
right/2, right/3 関数 → pad/3 関数
right(String, Number) -> Right right(String, Number, Character) -> Right
Types
String = Right = string() Number = integer() >= 0 Character = char()
Numberに従って長さが左側方向に調整されたStringを返す。 右側方向は固定されている。length(String) < Number
の場合、Stringには空白またはCharacterが埋め込まれる。
Example:
> string:right("Hello", 10). " Hello" > string:right("Hello", 10, $.). ".....Hello"
right/2
, right/3
関数の代わりに、pad/3
, pad/4
関数を使う。 pad/3
, pad/4
の返り値はunicode:charlist()
なので unicode:characters_to_list/1
でフラット化した。
> string:pad("Hello", 10, leading). [" ","Hello"] > string:pad("Hello", 10, leading, "."). [[".",".",".",".","."],"Hello"] > unicode:characters_to_list(string:pad("Hello", 10, leading)). " Hello" > unicode:characters_to_list(string:pad("Hello", 10, leading, ".")). ".....Hello"
rstr/2 関数 → find/3 関数
rstr(String, SubString) -> Index
Types
String = SubString = string() Index = integer() >= 0
SubStringの最後の出現がStringで始まる位置(右側からみて最初に出現する位置)を返す。 SubStringがStringに存在しない場合、0を返す。
Example:
> string:rstr("foo, bar, baz", "ba"). 11 > string:rstr("foo, bar, baz", "qu"). 0
rstr/2
関数の代わりに、find/3
関数を使う。rstr/2
では位置を返すが、find/3
関数では残りの文字列を返す点に注意する。また、rstr/2
関数はSubStringが存在しない場合は0を返すが、find/3
関数ではnomatchを返す。
> string:find("foo, bar, baz", "ba", trailing). "baz" > string:find("foo, bar, baz", "qu", trailing). nomatch
span/2 関数 → take/2 関数
span(String, Chars) -> Length
Types
String = Chars = string() Length = integer() >= 0
Stringの最大初期セグメントの長さを返す。これは、Charsの文字のみで構成される。つまり、連続してCharsの文字である文字数を返す。
Example:
> lists:seq($a,$z). "abcdefghijklmnopqrstuvwxyz" > string:span("abcdef123456", lists:seq($a,$z)). 6
scpan/2
の関数の代わりに、take/2
関数と使う。take/2
関数では文字数そのものが得られるわけではないので注意する。
> {L, T} = string:take("abcdef123456", lists:seq($a,$z)). {"abcdef","123456"} > string:length(L). 6
str/2 関数 → find/2 関数
str(String, SubString) -> Index
Types
String = SubString = string() Index = integer() >= 0
SubStringの最初の出現がStringで始まる位置(左側からみて最初に出現する位置)を返す。 SubStringがStringに存在しない場合、0を返す。
This function is obsolete. Use find/2.
Example:
> string:str("foo, bar, baz", "ba"). 6 > string:str("foo, bar, baz", "qu"). 0
str/2
関数の代わりに、find/2
, find/3
関数を使う。str/2
では位置を返すが、find/2
, find/3
関数では残りの文字列を返す点に注意する。また、str/2
関数はSubStringが存在しない場合は0を返すが、find/2
, find/3
関数ではnomatchを返す。
> string:find("foo, bar, baz", "ba"). "bar, baz" > string:find("foo, bar, baz", "ba", leading). "bar, baz" > string:find("foo, bar, baz", "qu"). nomatch
strip/1, strip/2, strip/3 関数 → trim/3 関数
strip(String :: string()) -> string() strip(String, Direction) -> Stripped strip(String, Direction, Character) -> Stripped
Types
String = Stripped = string() Direction = left | right | both Character = char()
先頭(leading)または末尾(trailing)、あるいはその両方(both)から、空白、またはいくつかの文字が削除された文字列を返す。 Directionは左(left
)、右(right
)、またはその両方(both)が指定でき、空白を削除する方向を示す。strip/1
は strip(String,both)
と同等。
Example:
> string:strip(" Hello "). "Hello" > string:strip(" Hello ", right). " Hello" 35> string:strip("...Hello.....", both, $.). "Hello"
strip/1
, strip/2
, strip/3
関数の代わりに、trim/1
, trim/2
, trim/3
関数を使う。strip/3
の第3引数はchar()
型だが、trim/3
の第3引数は[grapheme_cluster()]
で形式が異なるので注意する。
> string:trim(" Hello "). "Hello" > string:trim(" Hello ", trailing). " Hello" > string:trim("...Hello.....", both, "."). "Hello"
sub_string/2, sub_string3 関数 → slice/3 関数
sub_string(String, Start) -> SubString sub_string(String, Start, Stop) -> SubString
Types
String = SubString = string() Start = Stop = integer() >= 1
位置StartからStringの終わりまで、または位置StopまでのStringの部分文字列を返す。
Example:
> string:sub_string("foo, bar, baz", 6). "bar, baz" > string:sub_string("foo, bar, baz", 6, 8). "bar"
sub_string/2
, sub_string3
関数の代わりに、slice/2
, slice/3
関数を使う。sub_string
関数の第2引数は指定した位置を部分文字列に含むが、slice
関数の第2引数は指定した位置は部分文字列に含まない。また、sub_string
関数の第3引数は位置を指定するが、slice
関数の第3引数は返す文字列の長さを指定する。
> > string:slice("foo, bar, baz", 5). "bar, baz" > string:slice("foo, bar, baz", 5, 3). "bar
substr/2, substr/3 関数 → slice/3 関数
substr(String, Start) -> SubString substr(String, Start, Length) -> SubString
Types
String = SubString = string() Start = integer() >= 1 Length = integer() >= 0
位置Startから始まり、文字列の末尾までまたは長さLengthまでのStringの部分文字列を返す。
Example:
> string:substr("foo, bar, baz", 6). "bar, baz" > string:substr("foo, bar, baz", 6, 3). "bar"
substr/2
, substr3
関数の代わりに、slice/2
, slice/3
関数を使う。substr
関数の第2引数は指定した位置を結果に含むが、slice
関数の第2引数は指定した位置は結果に含まない。
> string:slice("foo, bar, baz", 5). "bar, baz" > string:slice("foo, bar, baz", 5, 3). "bar
sub_word/2, sub_word/3 関数 → nth_lexeme/3 関数
sub_word(String, Number) -> Word sub_word(String, Number, Character) -> Word
Types
String = Word = string() Number = integer() Character = char()
文字列の位置Numberにある単語を返す。 単語は空白または文字で区切られる。
Example:
> string:sub_word("foo, bar, baz", 1). "foo," > string:sub_word("foo, bar, baz", 2). "bar," > string:sub_word("foo, bar, baz", 1, $,). "foo" > string:sub_word("foo, bar, baz", 2, $,). " bar"
sub_word/2
, sub_word/3
関数の代わりに、nth_lexeme/3
関数を使う。sub_word関数では第3引数はchar()
型だが、nth_lexeme関数では[grapheme_cluster()]
で形式が異なるので注意する。
> string:nth_lexeme("foo, bar, baz", 1, "\s"). "foo," > string:nth_lexeme("foo, bar, baz", 2, "\s"). "bar," > string:nth_lexeme("foo, bar, baz", 1, ","). "foo" > string:nth_lexeme("foo, bar, baz", 2, ","). " bar"
to_lower/1, to_upper/1 関数 → lowercase/1, uppercase/1, titlecase/1 or casefold/1 関数
to_lower(String) -> Result to_lower(Char) -> CharResult to_upper(String) -> Result to_upper(Char) -> CharResult
Types
String = Result = io_lib:latin1_string() Char = CharResult = char()
指定された文字列または文字は大文字と小文字が変換される。サポートされている文字セットは ISO/IEC 8859-1(Latin1とも呼ばれる)。 この文字セット以外のすべての値は変更されない。
Example:
> $H. 72 > $h. 104 > string:to_lower($H). 104 > string:to_upper($h). 72 > string:to_lower("HELLO"). "hello" > string:to_upper("hello"). "HELLO"
to_lower/1
, to_upper/1
関数の代わりに、lowercase/1
, uppercase/1
関数を使う。その他、最初の文字を大文字にしたい場合は titlecase/1
関数を使う。また、大文字小文字を区別しないで文字列を比較したい場合は casefold/1
関数を使う。
> string:lowercase("h"). "h" > string:uppercase("H"). "H" > string:lowercase("HELLO"). "hello" > string:uppercase("hello"). "HELLO"
tokens/2 関数 → lexemes/2 関数
tokens(String, SeparatorList) -> Tokens
Types
String = SeparatorList = string() Tokens = [Token :: nonempty_string()]
SeparatorListの文字で区切られた文字列のトークンのリストを返す。
Example:
> string:tokens("foo, bar, baz", ","). ["foo, ba",", baz"]
tokens/2
関数の代わりに、lexemes/2
関数を使う。
> string:lexemes("foo, bar, baz", "r"). ["foo, ba",", baz"]
words/1, words/2 関数 → lexemes/2 関数
words(String) -> Count words(String, Character) -> Count
Types
String = string() Character = char() Count = integer() >= 1
空白または文字で区切られた文字列の単語数を返す。
Example:
> string:words("foo, bar, baz"). 3 > string:words("foo, bar, baz", $r). 2
words/1
, words/2
関数の代わりに、lexemes/2
関数を使う。worrd
関数は単語数を返すが、lexemes
関数は文字で区切った文字列のリストを返す。また、第3引数の形式が異なるので注意する。
> N1 = string:lexemes("foo, bar, baz", "\s"). ["foo,","bar,","baz"] > length(N1). 3 > N2 = string:lexemes("foo, bar, baz", "r"). ["foo, ba",", baz"] > length(N2). 2