erlang-有没有一种方法可以删除句子中的字符而不使用字符串?

时间:2019-11-25 09:49:02

标签: erlang

我试图在不使用string模块的情况下删除句子中的字符。例如,“我想删除字符”,我想删除句子中出现的所有“ e”,并计算我删除了多少“ e”。

我已经使用字符串完成了,代码如下:

-module(remove_count_characters).
-export([remove/2, count/2]).

remove(Sentence, Words)
->
string:split(Sentence, Words, trailing)
.

count(Sentence, Words) 
->
erlang:length(string:split(Sentence, Words, all)) - 1
.

3 个答案:

答案 0 :(得分:1)

  

我想删除句子中出现的所有“ e”,并计算   我删除了许多“ e”。

请记住,在erlang中,双引号字符串实际上是包含双引号字符串中字符的ascii代码(整数)的列表:

1> "abc" == [97, 98, 99].
true

使用带有两个 累加器变量 的递归:

remove(TargetStr, Str) ->
    remove(TargetStr, Str, _NewStr=[], _Count=0).

remove(_TargetStr, _Str=[], NewStr, Count) -> %when there are no more characters left in Str
    {lists:reverse(NewStr), Count};
remove([Char]=TargetStr, _Str=[Char|Chars], NewStr, Count) -> %when Char matches the first character in Str
    remove(TargetStr, Chars, NewStr, Count+1);
remove(TargetStr, _Str=[Char|Chars], NewStr, Count) -> %when the other clauses don't match, i.e. when Char does NOT match the first character in Str
    remove(TargetStr, Chars, [Char|NewStr], Count).

在外壳中:

57> a:remove("e", "I want to remove characters").
{"I want to rmov charactrs",3}

使用lists:foldr/3

remove([TargetChar]=_TargetStr, Str) ->
    Remover = fun(Char, _AccIn={NewStr, Count}) when Char==TargetChar ->
                     _AccOut={NewStr, Count+1};
                 (Char, _AccIn={NewStr, Count}) when Char=/=TargetChar ->
                     _AccOut={[Char|NewStr], Count} 
              end,
    lists:foldr(Remover, _InitialAcc={_NewStr=[], _Count=0}, Str).

答案 1 :(得分:1)

我想您可以尝试使用re:replace/3。例如:

1> re:replace("Replaze", "z", "c", [global, {return, list}]). 
"Replace"
2> 1> re:replace("Remove word", "Remove ", "", [global, {return, list}]).
"word"

您还可以尝试使用列表生成器,例如,对于删除e,您可以尝试执行以下操作:

1> [X || X <- "eeeaeeebeeeceee", X =/= $e].
"abc"

计算获得结果的e已被删除的数量如下:

1> List = "eeeaeeebeeeceee".
"eeeaeeebeeeceee"
2> Result = [X || X <- "eeeaeeebeeeceee", X =/= $e].
"abc"
3> {Result, Count} = {Result, length(List -- Result)}.
{"abc",12}

答案 2 :(得分:0)

我建议您使用如下列表操作:

% remove("abcde",[],0) = {"abcd",1}

remove([],Acc,Total) -> {lists:reverse(Acc),Total};
remove([$e|L],Acc,Total) -> remove(L,Acc,Total +1 );
remove([E|L],Acc,Total ) -> remove(L,[E|Acc],Total).