> Erlang中文手册 > tokens/2 使用分隔符把字符串分割

string:tokens/2

使用分隔符把字符串分割

用法:

tokens(String, SeparatorList) -> Tokens

内部实现:

%% tokens(String, Seperators).
%%  Return a list of tokens seperated by characters in Seperators.

-spec tokens(String, SeparatorList) -> Tokens when
      String :: string(),
      SeparatorList :: string(),
      Tokens :: [Token :: nonempty_string()].

tokens(S, Seps) ->
    tokens1(S, Seps, []).

tokens1([C|S], Seps, Toks) ->
    case member(C, Seps) of
	true -> tokens1(S, Seps, Toks);
	false -> tokens2(S, Seps, Toks, [C])
    end;
tokens1([], _Seps, Toks) ->
    reverse(Toks).

tokens2([C|S], Seps, Toks, Cs) ->
    case member(C, Seps) of
	true -> tokens1(S, Seps, [reverse(Cs)|Toks]);
	false -> tokens2(S, Seps, Toks, [C|Cs])
    end;
tokens2([], _Seps, Toks, Cs) ->
    reverse([reverse(Cs)|Toks]).

用分隔符把字符串 String 分割成一个字符串列表,分隔符参数 SeparatorList 可以为一个或多个符号。

string:tokens("a-b-c-d-e", "-").
string:tokens("abcdefghi jklmn", "bf l").

string:tokens/2 不支持 "空分隔符" 分割,因此不能把 "abcd" 这样的字符串里的每一个字符分割成 ["a", "b", "c", "d"],不过利用 string:substr/3 函数实现。

Str = "abcd",
Len = length(Str),
F = fun(Start, AccList) ->
    Element = string:substr(Str, Start, 1),
    [Element | AccList]
end,
lists:foldr(F, [], lists:seq(1, Len)).