Frage

Gibt es eine Möglichkeit, einen Bitstring zu teilen, der aus einer Datei auf Newlines geladen wurde? Ich habe so etwas:

A line of text
Additional line of text
And another line

Und ich möchte ein Array wie dieses:

["A line of text",
"Additional line of text",
"And another line"]

Gibt es eine Funktion, um den Text auf Newlines zu teilen, um so etwas wie dieses Array zu produzieren?

Danke im Voraus.

War es hilfreich?

Lösung

Zusätzlich zu Roberts Antwort.

In Elixir können Sie verwenden: String.split(string, "\n")Ansehen Saite Modul.

Andere Tipps

Ansehen binary:split/2/3 im Modul binär. Zum Beispiel mit binary:split(String, <<"\n">>).

Wenn Sie einfach eine Zeichenfolge einteilen \n, Es gibt einige schwerwiegende Portabilitätsprobleme. Dies liegt daran, dass viele Systeme verwenden \n, einige verwenden ältere Macs \r und Windows verwendet \r\n neue Zeilen abgrenzen.

Die sicherere Möglichkeit, es zu tun, wäre, einen Regex zu verwenden, um eine der drei oben genannten Möglichkeiten abzustimmen:String.split(str, ~r{(\r\n|\r|\n)}.

Während Mark mit den Portabilitätsproblemen Recht hat, enthält der von ihm bereitgestellte Regex einen Tippfehler und funktioniert als Ergebnis nicht für \r\n Sequenzen. Hier ist eine einfachere Version, die alle 3 Fälle übernimmt:

iex(13)> String.split("foo\nbar", ~r/\R/)
["foo", "bar"]
iex(14)> String.split("foo\rbar", ~r/\R/)
["foo", "bar"]
iex(15)> String.split("foo\r\nbar", ~r/\R/)
["foo", "bar"]

Ich bin kürzlich auf eine Situation gestoßen, in der ich die Lösung in meiner anderen Antwort Und im Grunde war jede andere Lösung, die von den regulären Ausdrücken abhängt, in einigen Situationen viel langsamer als abhängig von der binären Split, insbesondere wenn die Menge der Teile eingeschränkt wurde, in die die Saite geteilt wird. Du kannst sehen https://github.com/crowdhailer/server_sent_event.ex/pull/11 Für eine detailliertere Analyse und einen Benchmark.

Sie können verwenden :binary.split/3 Auch wenn sich verschiedene Arten neuer Zeilenzeichen ansprechen:

iex(1)> "aaa\rbbb\nccc\r\nddd" |> :binary.split(["\r", "\n", "\r\n"], [:global])     
["aaa", "bbb", "ccc", "ddd"]

Wie Sie im obigen Beispiel sehen können, ist das Match gierig und \r\n nimmt Vorrang vor der Aufteilung durch \r Zuerst und dann \n.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top