首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

string

模块

字符串

模块摘要

字符串处理功能。

描述

该模块提供字符串处理功能。

该模块中的字符串由unicode:chardata()代码点列表,具有UTF-8编码代码点的二进制文件UTF-8二进制文件)或二者的组合表示。

代码语言:javascript
复制
"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

该模块在字形集群上运行。甲字形簇是用户感知的字符,其可以由几个码点来表示。

代码语言:javascript
复制
"å"  [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二进制文件,但不是所有的函数都会验证所有的二进制文件是否正确编码。

除非另有规定,否则返回值类型与输入类型相同。也就是说,二进制输入返回二进制输出,列表输入返回列表输出,而混合输入可以返回混合输出。

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
1> string:casefold("Ω and ẞ SHARP S").
"ω and ss sharp s"

chomp(String :: unicode:chardata()) -> unicode:chardata()

返回任何尾随\n\r\n已从中删除的字符串String

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
1> string:is_empty("foo").
false
2> string:is_empty(["",<<>>]).
true

length(String :: unicode:chardata()) -> integer() >= 0

返回中的字形群集数String

例子:

代码语言:javascript
复制
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]是一个字形集群。

例子:

代码语言:javascript
复制
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在转换要测试相等性的字符串时应该使用函数。

例子:

代码语言:javascript
复制
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}下一个字节无效,则返回元组。

例子:

代码语言:javascript
复制
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}下一个字节无效,则返回元组。

例子:

代码语言:javascript
复制
1> string:next_grapheme(unicode:characters_to_binary("e̊fg")).
["e̊"|<<"fg">>]

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

类型

返回语义数NString,其中的词位是通过在石墨烯簇分离SeparatorList

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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被替换是。

可作为:

代码语言:javascript
复制
lists:join(Replacement, split(String, SearchPattern, Where)).

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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,表示要从哪个方向进行角色拍摄。

例子:

代码语言:javascript
复制
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为标题。

例子:

代码语言:javascript
复制
1> string:titlecase("ß is a SHARP s").
"Ss is a SHARP s"

to_float(String) -> {Float, Rest} | {error, Reason}

类型

参数String预计以一个有效的文本表示为float(数字是ASCII值)开始。浮动后字符串中剩余的字符返回Rest

例子:

代码语言:javascript
复制
> {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

例子:

代码语言:javascript
复制
> {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为字形集群列表。

例子:

代码语言:javascript
复制
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标准,这是一个字形群集。

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
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

例子:

代码语言:javascript
复制
> string:cspan("\t    abcdef", " \t").
0

join(StringList, Separator) -> String

类型

返回一个字符串,其中的元素StringList由字符串分隔开Separator

这个功能是obsolete。使用lists:join/2

例子:

代码语言:javascript
复制
> 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

例子:

代码语言:javascript
复制
> 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

例子:

代码语言:javascript
复制
> string:right("Hello", 10, $.).
".....Hello"

rstr(String, SubString) -> Index

类型

返回将最后一次出现的位置SubString的开始String。如果SubString不存在String,则返回0

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

例子:

代码语言:javascript
复制
> string:rstr(" Hello Hello World World ", "Hello World").
8

span(String, Chars) -> Length

类型

返回最大初始段的长度String,其中完全由字符组成Chars

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

例子:

代码语言:javascript
复制
> string:span("\t    abcdef", " \t").
5

str(String, SubString) -> Index

类型

返回将第一次出现的位置SubString的开始String0如果SubString不存在,则返回String

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

例子:

代码语言:javascript
复制
> 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

例子:

代码语言:javascript
复制
> string:strip("...Hello.....", both, $.).
"Hello"

sub_string(String, Start) -> SubString

sub_string(String, Start, Stop) -> SubString

类型

返回一个子字符串String,从位置开始Start到字符串结尾,或者返回并包含位置Stop

这个功能是obsolete。使用slice/3

例子:

代码语言:javascript
复制
sub_string("Hello World", 4, 8).
"lo Wo"

substr(String, Start) -> SubString

substr(String, Start, Length) -> SubString

类型

返回一个子字符串String,从位置开始Start,结束于字符串的末尾或最后Length

这个功能是obsolete。使用slice/3

例子:

代码语言:javascript
复制
> substr("Hello World", 4, 5).
"lo Wo"

sub_word(String, Number) -> Word

sub_word(String, Number, Character) -> Word

类型

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

这个功能是obsolete。使用nth_lexeme/3

例子:

代码语言:javascript
复制
> 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

例子:

代码语言:javascript
复制
> 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

例子:

代码语言:javascript
复制
> words(" Hello old boy!", $o).
4

注记

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

扫码关注腾讯云开发者

领取腾讯云代金券