2016-05-31 39 views
1

隣の区切り文字で区切られた文字列を分割したい場合があります。隣の区切り文字で区切られた文字列

だから私は今のためにこれを持っている:

split(L, C) -> lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]). 

split([], _, Acc) -> Acc; 
split([C|T], C, Acc) -> split(T, C, [[]|Acc]); 
split([H|T], C, [AH|AT]) -> split(T, C, [[H|AH]|AT]). 

戻り値は入力tut6:split("12432524,,32453,4", ",").ため["12432524,,32453,4"]であることを起こります。私は問題が何であるか理解していない。 誰かが私にそれを指摘できますか?

必要な出力は、あなたの種類の助けを事前に["12432524", "", "32453", "4"]

おかげです。

+1

あなたは[ '再:スプリット/ 3']で簡単にこれを行うことができます(http://erlang.org/doc/man/re.html#split-3):'再してみてください:スプリット( "12432524 ,, 32453,4 "、"、 "、[{return、list}])。'を実行すると、' ["12432524"、[]、 "32453"、 "4"] 'のような結果が返されることがわかります。 –

答えて

5

問題は、分割している文字列の各文字を文字列区切り全体と比較していることです。あなたは

tut6:split("12432524,,32453,4", ","). 

を呼び出すと、あなたのモジュール内split/3の最初の呼び出しは次のとおりです。

split([$1|"2432524,,32453,4"], ",", [[]]) ... 

最初の引数の頭部が文字1ですが、文字列にそれを比較","もちろん、それは決して一致しないので、入力文字列は決して分割されません。

は、この問題を解決するには、いくつかの方法があります。

  • 呼び出し側はこのように、文字列ではなく文字の区切りを渡しておいてください。

    tut6:split(2432524,,32453,4", $,). 
    
  • は、発信者を持っている文字列の区切りを渡します実際のセパレータとして最初の文字のみを使用します。あなたは、セパレータとして最初の文字だけを使用し、後続の文字を無視するように単一の文字区切り文字列、または

    split(L,[C|_]) -> 
        lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]). 
    

    を強制的に

    split(L,[C]) -> 
        lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]). 
    

    のいずれかにあなたのコードでsplit(L,C)を変更することによって、これを達成することができます。

  • 呼び出し元に文字列区切り文字を渡し、文字列内の各文字を潜在的な区切り文字として扱わせるようにします。
  • 呼び出し元に文字列区切り文字を渡し、文字列全体を区切り文字として扱わせるようにします。

あなたはre:split/3を使用して、これらの最後を達成することができます

split(L, C) -> re:split(L, C, [{return,list}]). 

それは","のような単純なセパレータとして動作しますがない限り、一般的には動作しませんので、このコードは、しかし、完全には正しくありません。セパレータ文字列内のすべての正規表現メタキャラクタを引用します。

関連する問題