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

时间:2013-11-06 22:41:51

标签: erlang export newline elixir bitstring

有没有办法在换行符上拆分从文件加载的位串?我有这样的事情:

A line of text
Additional line of text
And another line

我想要一个这样的数组:

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

是否有一个函数可以分割换行符上的文本以产生类似这个数组的东西?

提前致谢。

5 个答案:

答案 0 :(得分:17)

除了罗伯茨回答。

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

答案 1 :(得分:10)

查看模块binary中的binary:split/2/3。例如binary:split(String, <<"\n">>)

答案 2 :(得分:3)

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

答案 3 :(得分:2)

如果您只是在\n上拆分字符串,则存在一些严重的可移植性问题。这是因为许多系统使用\n,少数系统使用\r,而Windows则使用\r\n来分隔新行。

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

答案 4 :(得分:1)

我最近遇到一种情况,在某些情况下,the solution in my other answer以及基本上任何其他基于正则表达式的解决方案都比依赖二进制拆分要慢得多,尤其是在限制字符串拆分成的部分数量时。您可以查看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的划分。