2016-05-31 20 views
1

Ich möchte eine Zeichenfolge mit benachbarten Trennzeichen teilen (wenn Sie sich erinnern, die string:tokens ignoriert benachbarte Trennzeichen).Split-String mit benachbarten Trennzeichen

So habe ich dies jetzt:

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]). 

Der Rückgabewert geschieht tut6:split("12432524,,32453,4", ",").["12432524,,32453,4"] für die Eingabe zu sein. Ich verstehe nicht, was das Problem ist. Kann mir jemand bitte darauf hinweisen?

Die erforderliche Ausgabe ist ["12432524", "", "32453", "4"]

Vielen Dank im Voraus für Ihre Hilfe.

+1

Sie können dies leicht mit ['re: split/3'] (http://erlang.org/doc/man/re.html#split-3) tun: versuchen' re: split ("12432524 ,, 32453,4 ",", ", [{return, list}]).'in der Shell und Sie werden sehen, dass es genau das Ergebnis zurückgibt, das Sie wollen:' ["12432524", [], "32453", "4"] '. –

Antwort

5

Das Problem besteht darin, dass Sie jedes Zeichen der zu trennenden Zeichenfolge mit dem gesamten Zeichenfolgentrennzeichen vergleichen. Wenn Sie

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

dann der erste Aufruf von split/3 in Ihrem Modul nennen ist:

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

Der Kopf des ersten Arguments der Charakter ist1 aber Sie vergleichen es mit dem String"," , und natürlich wird das nie übereinstimmen und so wird Ihre Eingabezeichenfolge nie geteilt.

Es gibt ein paar Möglichkeiten, dies zu beheben:

  • Haben der Anrufer ein Zeichen Separator passieren, anstatt eine Zeichenfolge, wie folgt aus:

    tut6:split(2432524,,32453,4", $,). 
    
  • Haben Sie den Anrufer einen String-Trenn passieren Verwenden Sie jedoch nur das erste Zeichen als das tatsächliche Trennzeichen. Sie können dies erreichen, indem split(L,C) in Ihrem Code zu beiden

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

    Ändern eines einzelnen Zeichen Trenn-String zu zwingen, oder

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

    nur das erste Zeichen als Trennzeichen zu verwenden und alle nachfolgenden Zeichen ignorieren.

  • Lassen Sie den Aufrufer ein Zeichenfolgentrennzeichen übergeben und behandeln Sie jedes Zeichen in der Zeichenfolge als mögliches Trennzeichen.
  • Lassen Sie den Aufrufer ein Zeichenfolgentrennzeichen übergeben und behandeln Sie die gesamte Zeichenfolge als Trennzeichen.

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

    Dieser Code ist nicht ganz korrekt, aber, wie es für einen einfachen Separator wie "," arbeitet aber im Allgemeinen nicht funktionieren, es sei denn:

Sie können die letzte dieser re:split/3 mit erreichen Sie geben alle Metazeichen für reguläre Ausdrücke in der Trennzeichenfolge an.

Verwandte Themen