Erlang 20

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/3replace/3split/2split/2trim/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()

类型

返回trueif ABequal,否则返回false

如果IgnoreCasetrue函数casefolding的平等测试前的飞行。

如果Norm不是none功能在平等测试之前动态应用标准化。有四种可供正常化形式:nfcnfdnfkc,和nfkd

默认情况下,IgnoreCasefalseNormnone

例子:

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

类型

之前删除任何东西SearchPatternString,并返回字符串的其余部分或者nomatch如果SearchPattern没有找到。Dir,它可以是,leading或者trailing,表示要从哪个方向搜索字符。

默认情况下Dirleading

例子:

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()}

返回第一个代码点StringString尾部的其余部分。如果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()}

返回第一个字形集群StringString尾部的其余部分。如果String为空,则返回空列表;如果{error, String}下一个字节无效,则返回元组。

例子:

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

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

类型

返回语义数NString,其中的词位是通过在石墨烯簇分离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()

类型

StringLength与字形集群CharDir,可以是leadingtrailing或者both,表示应该添加填充的位置。

默认情况下,Char$\sDirtrailing

例子:

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()]

类型

替换SearchPatternStringReplacementWhere,默认leading,指示是否leading时,trailingall的遭遇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

默认情况下Lengthinfinity

例子:

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()]

类型

拆分StringSearchPattern遇到并返回其余部分。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或集合的补集CharactersDir,可以是,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它可以是leadingtrailing或者both,表示要从哪个方向删除字符。

缺省值Characters是一组不可分割的空白代码点,定义为Pattern_White_Space Unicode Standard Annex #31By default, Dirboth

请注意,[$\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

类型

返回Characterin 的第一个匹配项的索引String。如果Character不发生,则返回0

这个功能是obsolete。使用find/2

concat(String1, String2) -> String3

类型

连接String1String2形成String3返回的新字符串。

这个功能是obsolete。使用[String1, String2]Data参数,并调用unicode:characters_to_list/2unicode: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/2pad/3

例子:

> string:left("Hello",10,$.). "Hello....."

len(String) -> Length

类型

返回中的字符数String

这个功能是obsolete。使用length/1

rchr(String, Character) -> Index

类型

返回最后一次出现的索引CharacterString。如果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的开始String0如果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,它可以是leftright或者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

类型

返回位置的字NumberString。单词由空格或Characters 分隔。

这个功能是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/1uppercase/1titlecase/1casefold/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

注记

一些通用的字符串函数似乎可以相互重叠。原因是这个字符串包是两个较早包的组合,并且两个包的所有功能都被保留了下来。