有没有办法在换行符上拆分从文件加载的位串?我有这样的事情:
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。例如与binary: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"]
我最近遇到了这样一种情况,即我的其他答案中的解决方案以及基本上任何其他依赖于正则表达式的解决方案在某些情况下都比依赖二进制拆分慢得多,尤其是在限制字符串拆分成的部分数量时。您可以查看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
first 和 then分割\n
。