erlang:string strip多个字符

时间:2015-08-02 15:58:44

标签: string erlang

我看到erlang有string:strip方法,您还可以指定要在第三个参数上去掉哪个字符:

string:strip("...Hello.....", both, $.).

但是,如何定义要剥离的多个字符?例如,如果我有".;.;..Hello...;..",我想将其剥离为"Hello"

2 个答案:

答案 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.