当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang split(Subject, RE, Options)用法及代码示例


split(Subject, RE, Options) -> SplitList
类型:
Subject = iodata() | unicode:charlist()
RE = mp() | iodata() | unicode:charlist()
Options = [Option]
Option = 
    anchored | notbol | noteol | notempty | notempty_atstart |
    {offset, integer() >= 0} |
    {newline, nl_spec()} |
    {match_limit, integer() >= 0} |
    {match_limit_recursion, integer() >= 0} |
    bsr_anycrlf | bsr_unicode |
    {return, ReturnType} |
    {parts, NumParts} |
    group | trim | CompileOpt
NumParts = integer() >= 0 | infinity
ReturnType = iodata | list | binary
CompileOpt = compile_option()
参看 compile/2.
SplitList = [RetData] | [GroupedRetData]
GroupedRetData = [RetData]
RetData = iodata() | unicode:charlist() | binary() | list()

通过根据提供的正则表达式查找标记,将输入拆分为多个部分。分割本质上是通过运行全局正则表达式匹配并在匹配发生的地方分割初始字符串来完成的。字符串的匹配部分将从输出中删除。

如在run/3, 一个mp()使用选项编译unicode需要Subject成为一个统一码charlist()。如果编译是隐式完成的并且unicode为该函数指定编译选项,包括正则表达式和Subject被指定为有效的 Unicodecharlist()s.

结果以 "strings" 列表的形式给出,这是选项 return 中指定的首选数据类型(默认 iodata )。

如果在正则表达式中指定了子表达式,则匹配的子表达式也会在结果列表中返回。例如:

re:split("Erlang","[ln]",[{return,list}]).

["Er","a","g"]

尽管

re:split("Erlang","([ln])",[{return,list}]).

["Er","l","a","n","g"]

与子表达式(在正则表达式中用括号标记)匹配的文本将插入到找到它的结果列表中。这意味着在整个正则表达式是单个子表达式(如上一个示例)的情况下连接拆分结果始终会产生原始字符串。

由于示例中的最后一部分("g")没有匹配的子表达式,因此之后不会插入任何内容。为了使字符串组和与子表达式匹配的部分更加明显,可以使用选项 group ,它将主题字符串的部分与字符串拆分时与子表达式匹配的部分组合在一起:

re:split("Erlang","([ln])",[{return,list},group]).

[["Er","l"],["a","n"],["g"]]

这里正则表达式首先匹配"l",导致"Er"成为结果中的第一部分。当正则表达式匹配时,(唯一)子表达式绑定到"l",因此"l" 与"Er" 一起插入到组中。下一个匹配是"n",使"a"成为下一个要返回的部分。由于在本例中子表达式绑定到子字符串"n",因此"n" 被插入到该组中。最后一组由剩余的字符串组成,因为找不到更多匹配项。

默认情况下,函数返回字符串的所有部分,包括空字符串,例如:

re:split("Erlang","[lg]",[{return,list}]).

["Er","an",[]]

因为字符串末尾的 "g" 的匹配留下了一个空的休息,它也被返回。此行为与 Perl 中 split 函数的默认行为不同,默认情况下会删除末尾的空字符串。要获得 Perl 的 "trimming" 默认行为,请将 trim 指定为选项:

re:split("Erlang","[lg]",[{return,list},trim]).

["Er","an"]

"trim" 选项表示; “给我尽可能多的零件,除了空的零件”,有时这很有用。您还可以通过指定 {parts, N } 来指定所需的零件数量:

re:split("Erlang","[lg]",[{return,list},{parts,2}]).

["Er","ang"]

请注意,最后一部分是 "ang",而不是 "an",因为分割被指定为两部分,并且当给出足够的部分时分割停止,这就是结果与 trim 的结果不同的原因。

此 indata 不可能包含超过三个部分,因此

re:split("Erlang","[lg]",[{return,list},{parts,4}]).

给出与默认值相同的结果,这被视为“无限多个部分”。

0 指定为部件数具有与选项 trim 相同的效果。如果捕获子表达式,并且指定了 trim{parts,0},则末尾匹配的空子表达式也会从结果中删除。

trim 行为与 Perl 默认行为完全对应。 {parts,N}(其中 N 是正整数)与具有正数值第三个参数的 Perl 行为完全对应。当将负整数指定为 Perl 例程的第三个参数时,split/3 的默认行为对应于 Perl 行为。

之前未针对函数 run/3 说明的选项摘要:


{return,ReturnType}

指定原始字符串的各个部分在结果列表中的显示方式。有效类型:


iodata

iodata() 的变体,在当前实现中提供最少的数据复制(通常是二进制文件,但不依赖于它)。


binary

所有部分均以二进制形式返回。


list

所有部分均以字符列表形式返回 ("strings")。


group

将字符串的部分与与正则表达式的子表达式匹配的字符串的部分组合在一起。

在这种情况下,函数的返回值是 list()list() 。每个子列表都以从主题字符串中选取的字符串开始,后面跟着按正则表达式中出现的顺序与每个子表达式匹配的部分。


{parts,N}

指定主题字符串要分割成的部分数。

对于特定的最大部件数,部件数应为正整数,而 infinity 则为可能的最大部件数(默认值)。指定 {parts,0} 会给出尽可能多的部分,忽略末尾的空部分,与指定 trim 相同。


trim

指定忽略结果列表末尾的空白部分。与指定 {parts,0} 相同。这对应于 Perl 中 split 内置函数的默认行为。

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 split(Subject, RE, Options) -> SplitList。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。