我看到erlang有string:strip
方法,您还可以指定要在第三个参数上去掉哪个字符:
string:strip("...Hello.....", both, $.).
但是,如何定义要剥离的多个字符?例如,如果我有".;.;..Hello...;.."
,我想将其剥离为"Hello"
。
答案 0 :(得分:1)
使用剥离字符支持列表编写自己的strip/3
版本并不像看起来那么难:
strip(S, left, Ds) ->
lstrip(S, Ds);
strip(S, right, Ds) ->
rstrip(S, Ds);
strip(S, both, Ds) ->
rstrip(lstrip(S, Ds), Ds).
lstrip([], _) -> [];
lstrip([H|T] = S, Ds) ->
case lists:member(H, Ds) of
true -> lstrip(T, Ds);
false -> S
end.
rstrip([], _) -> [];
rstrip([H|T], Ds) ->
case rstrip(T, Ds) of
[] ->
case lists:member(H, Ds) of
true -> [];
false -> [H]
end;
S -> [H|S]
end.
注意lists:member/2
是BIF,这个版本是以最小化堆使用的方式编写的。
答案 1 :(得分:1)
以下函数从字符串S中取出要删除的字符列表L将实现您的目标:
stripm(S, both, L) -> S1 = stripm(S,L),
lists:reverse(stripm(lists:reverse(S1),L)).
stripm([], _L) -> [];
stripm(S = [H|T], L) ->
case lists:member(H, L) of
true ->
S1 = string:strip(T,left,H),
stripm(S1, L);
false ->
S
end.