簡體   English   中英

Elixir / Erlang在換行符上分割比特串?

[英]Elixir/Erlang split bitstring on newlines?

有沒有辦法在換行符上拆分從文件加載的位串? 我有這樣的事情:

A line of text
Additional line of text
And another line

我想要一個像這樣的數組:

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

是否有一個函數來分割換行符上的文本以產生類似這個數組的東西?

提前致謝。

除了羅伯茨的回答。

在Elixir中,您可以使用: String.split(string, "\\n")查看String模塊。

查看binary:split/2/3模塊二進制文件中的binary:split/2/3 例如,使用binary:split(String, <<"\\n">>)

雖然Mark對於可移植性問題是對的,但是他提供的正則表達式中有一個拼寫錯誤,因此對於\\r\\n序列不起作用。 這是一個處理所有3種情況的簡單版本:

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"]

如果您只是在\\n上拆分字符串,則存在一些嚴重的可移植性問題。 這是因為許多系統使用\\n ,這樣一個如一些老的Mac上使用\\r和Windows使用\\r\\n來界定新的生產線。

更安全的方法是使用正則表達式匹配上述三種可能性中的任何一種: String.split(str, ~r{(\\r\\n|\\r|\\n)}

我最近遇到的情況是,我的其他答案和基本上任何其他解決方案的解決方案取決於正則表達式在某些情況下比依賴於二進制拆分慢得多,特別是在限制字符串被拆分的部分數量時。 您可以查看https://github.com/CrowdHailer/server_sent_event.ex/pull/11以獲得更詳細的分析和基准。

即使針對不同類型的新行字符,您也可以使用:binary.split/3

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

正如您在上面的示例中所看到的,匹配是貪婪的, \\r\\n優先於上面的\\r先分割,然后是\\n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM