當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。