string
字符串
模块
字符串
模块摘要
字符串处理功能。
描述
该模块提供字符串处理功能。
该模块中的字符串由unicode:chardata()
代码点列表,具有UTF-8编码代码点的二进制文件
(UTF-8二进制文件
)或二者的组合表示。
"abcd" is a valid string
<<"abcd">> is a valid string
["abcd"] is a valid string
<<"abc..åäö"/utf8>> is a valid string
<<"abc..åäö">> is NOT a valid string,
but a binary with Latin-1-encoded codepoints
[<<"abc">>, "..åäö"] is a valid string
[atom] is NOT a valid string
该模块在字形集群上运行。甲字形簇
是用户感知的字符,其可以由几个码点来表示。
"å" [229] or [97, 778]
"e̊" [101, 778]
即使由代码点[223,8593,101,778]或UTF-8二进制表示,“ß↑e̊”的字符串长度为3 <<195,159,226,134,145,101,204,138>>。
类的代码点字形集群prepend
和非现代(或分解)韩文没有在性能方面的原因进行处理find/3
,replace/3
,split/2
,split/2
和trim/3
。
分割和附加字符串将在字形集群边界上完成。没有验证附加字符串的结果是有效的还是标准化的。
大多数函数需要将所有输入标准化为一种形式,例如参见unicode:characters_to_nfc_list/1
。
在任何功能中都不考虑语言或语言环境特定的输入处理。
这些函数可能会导致无效的输入字符串崩溃。例如,函数需要UTF-8二进制文件,但不是所有的函数都会验证所有的二进制文件是否正确编码。
除非另有规定,否则返回值类型与输入类型相同。也就是说,二进制输入返回二进制输出,列表输入返回列表输出,而混合输入可以返回混合输出。
1> string:trim(" sarah ").
"sarah"
2> string:trim(<<" sarah ">>).
<<"sarah">>
3> string:lexemes("foo bar", " ").
["foo","bar"]
4> string:lexemes(<<"foo bar">>, " ").
[<<"foo">>,<<"bar">>]
该模块已在Erlang/OTP 20中进行了修改,以处理unicode:chardata()
和操作字形集群。的old functions
,只有在Latin-1的列表作为输入工作仍然可用,但不应该使用。它们将在Erlang/OTP 21中被弃用。
数据类型
direction() = leading | trailing
grapheme_cluster() = char() | [char()]
用户感知的角色,由一个或多个代码点组成。
出口
casefold(String :: unicode:chardata()) -> unicode:chardata()
转换String
为与案例无关的可比较字符串。函数casefold/1
优于lowercase/1
两个字符串进行比较时的优先级。另见equal/4
。
例子:
1> string:casefold("Ω and ẞ SHARP S").
"ω and ss sharp s"
chomp(String :: unicode:chardata()) -> unicode:chardata()
返回任何尾随\n
或\r\n
已从中删除的字符串String
。
例子:
182> string:chomp(<<"\nHello\n\n">>).
<<"\nHello">>
183> string:chomp("\nHello\r\r\n").
"\nHello\r"
equal(A, B) -> boolean()
equal(A, B, IgnoreCase) -> boolean()
equal(A, B, IgnoreCase, Norm) -> boolean()
类型
返回true
if A
和B
equal,否则返回false
。
如果IgnoreCase
是true
函数casefolding
的平等测试前的飞行。
如果Norm
不是none
功能在平等测试之前动态应用标准化。有四种可供正常化形式:nfc
,nfd
,nfkc
,和nfkd
。
默认情况下,IgnoreCase
是false
和Norm
是none
。
例子:
1> string:equal("åäö", <<"åäö"/utf8>>).
true
2> string:equal("åäö", unicode:characters_to_nfd_binary("åäö")).
false
3> string:equal("åäö", unicode:characters_to_nfd_binary("ÅÄÖ"), true, nfc).
true
find(String, SearchPattern) -> unicode:chardata() | nomatch
find(String, SearchPattern, Dir) -> unicode:chardata() | nomatch
类型
之前删除任何东西SearchPattern
在String
,并返回字符串的其余部分或者nomatch
如果SearchPattern
没有找到。Dir
,它可以是,leading
或者trailing
,表示要从哪个方向搜索字符。
默认情况下Dir
是leading
。
例子:
1> string:find("ab..cd..ef", ".").
"..cd..ef"
2> string:find(<<"ab..cd..ef">>, "..", trailing).
<<"..ef">>
3> string:find(<<"ab..cd..ef">>, "x", leading).
nomatch
4> string:find("ab..cd..ef", "x", trailing).
nomatch
is_empty(String :: unicode:chardata()) -> boolean()
返回true
如果String
是空字符串,否则返回false
。
例子:
1> string:is_empty("foo").
false
2> string:is_empty(["",<<>>]).
true
length(String :: unicode:chardata()) -> integer() >= 0
返回中的字形群集数String
。
例子:
1> string:length("ß↑e̊").
3
2> string:length(<<195,159,226,134,145,101,204,138>>).
3
lexemes(String :: unicode:chardata()
,
SeparatorList :: [grapheme_cluster()]) ->
[unicode:chardata()
]
返回一个词位列表String
,由中的字形群集分隔SeparatorList
。
请注意,如本例所示,将两个或更多个相邻的分隔符字素组String
作为一个对待。也就是说,结果的词位列表中没有空字符串。另请参阅split/3
哪个返回空字符串。
注意这[$\r,$\n]
是一个字形集群。
例子:
1> string:lexemes("abc de̊fxxghix jkl\r\nfoo", "x e" ++ [[$\r,$\n]]).
["abc","de̊f","ghi","jkl","foo"]
2> string:lexemes(<<"abc de̊fxxghix jkl\r\nfoo"/utf8>>, "x e" ++ [$\r,$\n]).
[<<"abc">>,<<"de̊f"/utf8>>,<<"ghi">>,<<"jkl\r\nfoo">>]
lowercase(String :: unicode:chardata()) -> unicode:chardata()
转换String
为小写。
注意,casefold/1
在转换要测试相等性的字符串时应该使用函数。
例子:
2> string:lowercase(string:uppercase("Michał")).
"michał"
next_codepoint(String :: unicode:chardata()) ->
maybe_improper_list(char(), unicode:chardata()
) |
{error, unicode:chardata()
}
返回第一个代码点String
和String
尾部的其余部分。如果String
为空,则返回空列表;如果{error, String}
下一个字节无效,则返回元组。
例子:
1> string:next_codepoint(unicode:characters_to_binary("e̊fg")).
[101|<<"̊fg"/utf8>>]
next_grapheme(String :: unicode:chardata()) ->
maybe_improper_list(grapheme_cluster()
,
unicode:chardata()
) |
{error, unicode:chardata()
}
返回第一个字形集群String
和String
尾部的其余部分。如果String
为空,则返回空列表;如果{error, String}
下一个字节无效,则返回元组。
例子:
1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
["e̊"|<<"fg">>]
nth_lexeme(String, N, SeparatorList) -> unicode:chardata()
类型
返回语义数N
在String
,其中的词位是通过在石墨烯簇分离SeparatorList
。
例子:
1> string:nth_lexeme("abc.de̊f.ghiejkl", 3, ".e").
"ghi"
pad(String, Length) -> unicode:charlist()
pad(String, Length, Dir) -> unicode:charlist()
pad(String, Length, Dir, Char) -> unicode:charlist()
类型
垫String
到Length
与字形集群Char
。Dir
,可以是leading
,trailing
或者both
,表示应该添加填充的位置。
默认情况下,Char
是$\s
和Dir
是trailing
。
例子:
1> string:pad(<<"He̊llö"/utf8>>, 8).
[<<72,101,204,138,108,108,195,182>>,32,32,32]
2> io:format("'~ts'~n",[string:pad("He̊llö", 8, leading)]).
' He̊llö'
3> io:format("'~ts'~n",[string:pad("He̊llö", 8, both)]).
' He̊llö '
prefix(String :: unicode:chardata(), Prefix :: unicode:chardata()) ->
nomatch | unicode:chardata()
如果Prefix
是前缀String
,则将其移除并返回余数String
,否则返回nomatch
。
例子:
1> string:prefix(<<"prefix of string">>, "pre").
<<"fix of string">>
2> string:prefix("pre", "prefix").
nomatch
replace(String, SearchPattern, Replacement) ->
[unicode:chardata()
]
replace(String, SearchPattern, Replacement, Where) ->
[unicode:chardata()
]
类型
替换SearchPattern
在String
用Replacement
。Where
,默认leading
,指示是否leading
时,trailing
或all
的遭遇SearchPattern
被替换是。
可作为:
lists:join(Replacement, split(String, SearchPattern, Where)).
例子:
1> string:replace(<<"ab..cd..ef">>, "..", "*").
[<<"ab">>,"*",<<"cd..ef">>]
2> string:replace(<<"ab..cd..ef">>, "..", "*", all).
[<<"ab">>,"*",<<"cd">>,"*",<<"ef">>]
reverse(String :: unicode:chardata()) -> [grapheme_cluster()]
返回中的字形群集的反向列表String
。
例子:
1> Reverse = string:reverse(unicode:characters_to_nfd_binary("ÅÄÖ")).
[[79,776],[65,776],[65,778]]
2> io:format("~ts~n",[Reverse]).
ÖÄÅ
slice(String, Start) -> Slice
slice(String, Start, Length) -> Slice
类型
从位置开始返回String
至多为Length
字形群集的子字符串Start
。
默认情况下Length
是infinity
。
例子:
1> string:slice(<<"He̊llö Wörld"/utf8>>, 4).
<<"ö Wörld"/utf8>>
2> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,4).
"ö Wö"
3> string:slice(["He̊llö ", <<"Wörld"/utf8>>], 4,50).
"ö Wörld"
split(String, SearchPattern) -> [unicode:chardata()]
split(String, SearchPattern, Where) -> [unicode:chardata()]
类型
拆分String
当SearchPattern
遇到并返回其余部分。Where
,默认leading
,表示是否leading
,会遇到trailing
或将会分裂。allSearchPatternString
例子:
0> string:split("ab..bc..cd", "..").
["ab","bc..cd"]
1> string:split(<<"ab..bc..cd">>, "..", trailing).
[<<"ab..bc">>,<<"cd">>]
2> string:split(<<"ab..bc....cd">>, "..", all).
[<<"ab">>,<<"bc">>,<<>>,<<"cd">>]
take(String, Characters) -> {Leading, Trailing}
take(String, Characters, Complement) -> {Leading, Trailing}
take(String, Characters, Complement, Dir) -> {Leading, Trailing}
类型
从需要的字符String
,只要该字符集的成员Characters
或集合的补集Characters
。Dir
,可以是,leading
或者trailing
,表示要从哪个方向进行角色拍摄。
例子:
5> string:take("abc0z123", lists:seq($a,$z)).
{"abc","0z123"}
6> string:take(<<"abc0z123">>, lists:seq($0,$9), true, leading).
{<<"abc">>,<<"0z123">>}
7> string:take("abc0z123", lists:seq($0,$9), false, trailing).
{"abc0z","123"}
8> string:take(<<"abc0z123">>, lists:seq($a,$z), true, trailing).
{<<"abc0z">>,<<"123">>}
titlecase(String :: unicode:chardata()) -> unicode:chardata()
转换String
为标题。
例子:
1> string:titlecase("ß is a SHARP s").
"Ss is a SHARP s"
to_float(String) -> {Float, Rest} | {error, Reason}
类型
参数String
预计以一个有效的文本表示为float(数字是ASCII值)开始。浮动后字符串中剩余的字符返回Rest
。
例子:
> {F1,Fs} = string:to_float("1.0-1.0e-1"),
> {F2,[]} = string:to_float(Fs),
> F1+F2.
0.9
> string:to_float("3/2=1.5").
{error,no_float}
> string:to_float("-1.5eX").
{-1.5,"eX"}
to_integer(String) -> {Int, Rest} | {error, Reason}
类型
参数String
预期以有效文本表示整数(数字是ASCII值)开始。返回整数后的字符串中剩余的字符Rest
。
例子:
> {I1,Is} = string:to_integer("33+22"),
> {I2,[]} = string:to_integer(Is),
> I1-I2.
11
> string:to_integer("0.5").
{0,".5"}
> string:to_integer("x=2").
{error,no_integer}
to_graphemes(String :: unicode:chardata()) -> [grapheme_cluster()]
转换String
为字形集群列表。
例子:
1> string:to_graphemes("ß↑e̊").
[223,8593,[101,778]]
2> string:to_graphemes(<<"ß↑e̊"/utf8>>).
[223,8593,[101,778]]
trim(String) -> unicode:chardata()
trim(String, Dir) -> unicode:chardata()
trim(String, Dir, Characters) -> unicode:chardata()
类型
返回一个字符串,前面或后面或两者Characters
都被删除。Dir
它可以是leading
,trailing
或者both
,表示要从哪个方向删除字符。
缺省值Characters
是一组不可分割的空白代码点,定义为Pattern_White_Space Unicode Standard Annex #31
。By default, Dir
是both
。
请注意,[$\r,$\n]
根据Unicode标准,这是一个字形群集。
例子:
1> string:trim("\t Hello \n").
"Hello"
2> string:trim(<<"\t Hello \n">>, leading).
<<"Hello \n">>
3> string:trim(<<".Hello.\n">>, trailing, "\n.").
<<".Hello">>
uppercase(String :: unicode:chardata()) -> unicode:chardata()
转换String
为大写。
另见titlecase/1
。
例子:
1> string:uppercase("Michał").
"MICHAŁ"
过时API函数
下面是旧API的函数。这些函数只适用于拉丁文-1字符的列表。
注
这些功能保持向后兼容,但不推荐。它们将在Erlang/OTP 21中被弃用。
任何未string
公开的功能都不能使用。
出口
centre(String, Number) -> Centered
centre(String, Number, Character) -> Centered
类型
返回一个字符串,其中String
以字符串为中心并由空白或Character
。结果字符串有长度Number
。
这个功能是obsolete
。使用pad/3
。
chars(Character, Number) -> String
chars(Character, Number, Tail) -> String
类型
返回由字符组成的Number
字符串Character
。或者,该字符串可以以字符串结尾Tail
。
这个功能是obsolete
。使用lists:duplicate/2
。
chr(String, Character) -> Index
类型
返回Character
in 的第一个匹配项的索引String
。如果Character
不发生,则返回0
。
这个功能是obsolete
。使用find/2
。
concat(String1, String2) -> String3
类型
连接String1
和String2
形成String3
返回的新字符串。
这个功能是obsolete
。使用[String1, String2]
的Data
参数,并调用unicode:characters_to_list/2
或unicode:characters_to_binary/2
变平的输出。
copies(String, Number) -> Copies
类型
返回包含String
重复Number
次数的字符串。
这个功能是obsolete
。使用lists:duplicate/2
。
cspan(String, Chars) -> Length
类型
返回最大初始段的长度String
,它完全由不是来自的字符组成Chars
。
这个功能是obsolete
。使用take/3
。
例子:
> string:cspan("\t abcdef", " \t").
0
join(StringList, Separator) -> String
类型
返回一个字符串,其中的元素StringList
由字符串分隔开Separator
。
这个功能是obsolete
。使用lists:join/2
。
例子:
> join(["one", "two", "three"], ", ").
"one, two, three"
left(String, Number) -> Left
left(String, Number, Character) -> Left
类型
返回String的长度按照Number。左边距是固定的。如果length(String)< Number,则String填充空格或Characters。
这个功能是obsolete
。使用pad/2
或pad/3
。
例子:
> string:left("Hello",10,$.).
"Hello....."
len(String) -> Length
类型
返回中的字符数String
。
这个功能是obsolete
。使用length/1
。
rchr(String, Character) -> Index
类型
返回最后一次出现的索引Character
在String
。如果Character
不发生,则返回0
。
这个功能是obsolete
。使用find/3
。
right(String, Number) -> Right
right(String, Number, Character) -> Right
类型
返回String的长度按照Number。右边距是固定的。如果长度(String)< Number,则String用空白或Characters 填充。
这个功能是obsolete
。使用pad/3
。
例子:
> string:right("Hello", 10, $.).
".....Hello"
rstr(String, SubString) -> Index
类型
返回将最后一次出现的位置SubString
的开始String
。如果SubString
不存在String
,则返回0
。
这个功能是obsolete
。使用find/3
。
例子:
> string:rstr(" Hello Hello World World ", "Hello World").
8
span(String, Chars) -> Length
类型
返回最大初始段的长度String
,其中完全由字符组成Chars
。
这个功能是obsolete
。使用take/2
。
例子:
> string:span("\t abcdef", " \t").
5
str(String, SubString) -> Index
类型
返回将第一次出现的位置SubString
的开始String
。0
如果SubString
不存在,则返回String
。
这个功能是obsolete
。使用find/2
。
例子:
> string:str(" Hello Hello World World ", "Hello World").
8
strip(String :: string()) -> string()
strip(String, Direction) -> Stripped
strip(String, Direction, Character) -> Stripped
类型
返回一个字符串,其中前导或尾随或两者都有空白或一些Character
已被删除。Direction
,它可以是left
,right
或者both
,表示从哪个方向删除空白。strip/1
相当于strip(String, both)
。
这个功能是obsolete
。使用trim/3
。
例子:
> string:strip("...Hello.....", both, $.).
"Hello"
sub_string(String, Start) -> SubString
sub_string(String, Start, Stop) -> SubString
类型
返回一个子字符串String
,从位置开始Start
到字符串结尾,或者返回并包含位置Stop
。
这个功能是obsolete
。使用slice/3
。
例子:
sub_string("Hello World", 4, 8).
"lo Wo"
substr(String, Start) -> SubString
substr(String, Start, Length) -> SubString
类型
返回一个子字符串String
,从位置开始Start
,结束于字符串的末尾或最后Length
。
这个功能是obsolete
。使用slice/3
。
例子:
> substr("Hello World", 4, 5).
"lo Wo"
sub_word(String, Number) -> Word
sub_word(String, Number, Character) -> Word
类型
返回位置的字Number
的String
。单词由空格或Character
s 分隔。
这个功能是obsolete
。使用nth_lexeme/3
。
例子:
> string:sub_word(" Hello old boy !",3,$o).
"ld b"
to_lower(String) -> Result
to_lower(Char) -> CharResult
to_upper(String) -> Result
to_upper(Char) -> CharResult
类型
指定的字符串或字符是大小写转换的。请注意,支持的字符集是ISO/IEC 8859-1(也称为拉丁文1); 该集合之外的所有值都保持不变
该功能obsolete
使用lowercase/1
,uppercase/1
,titlecase/1
或casefold/1
。
tokens(String, SeparatorList) -> Tokens
类型
返回标记列表String
,由中的字符分隔SeparatorList
。
例子:
> tokens("abc defxxghix jkl", "x ").
["abc", "def", "ghi", "jkl"]
请注意,如本例所示,两个或多个相邻的分隔符字符String
被视为一个。也就是说,结果的标记列表中没有空字符串。
这个功能是obsolete
。使用lexemes/2
。
words(String) -> Count
words(String, Character) -> Count
类型
返回String
由空格或空格分隔的单词数量Character
。
这个功能是obsolete
。使用lexemes/2
。
例子:
> words(" Hello old boy!", $o).
4
注记
一些通用的字符串函数似乎可以相互重叠。原因是这个字符串包是两个较早包的组合,并且两个包的所有功能都被保留了下来。