换行符上的Elixir/Erlang拆分位字符串?

换行符上的Elixir/Erlang拆分位字符串?,erlang,export,newline,elixir,bitstring,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"] 我想要一个这样的数组: A line of text Additional line of text And another line ["A line of text", "Addit

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

A line of text
Additional line of text
And another line
["A line of text",
"Additional line of text",
"And another line"]
我想要一个这样的数组:

A line of text
Additional line of text
And another line
["A line of text",
"Additional line of text",
"And another line"]
是否有一个函数可以拆分换行符上的文本以生成类似于此数组的内容


提前感谢。

查看模块中的
二进制:拆分/2/3
。例如,除了Roberts answer之外,还使用了binary:split(String,)

在Elixir中,您可以使用:
String.split(String,“\n”)

查看模块。

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


更安全的方法是使用正则表达式匹配上述三种可能性中的任何一种:
String.split(str,~r{(\r\n | \r | \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"]

我最近遇到一种情况,基本上任何其他依赖正则表达式的解决方案在某些情况下都比依赖二进制拆分慢得多,特别是在限制字符串拆分成的部分数量时。您可以查看更详细的分析和基准测试

即使针对不同类型的新行字符,也可以使用:

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

正如您在上面的示例中所看到的,匹配是贪婪的,
\r\n
优先于先通过
\r
然后再通过
\n
进行拆分,您也可以使用
re
,但在这种简单的情况下,这是过分的。虽然这个想法是正确的,但是在第一个
字符之前的正则表达式中有一个额外的反斜杠acter.这是正确的版本:
String.split(“foo\r\nbar”,~r{\r\n |\r |\n})
没错,我已经编辑了答案以删除输入错误。谢谢!