【问题标题】:Elixir/Erlang split bitstring on newlines?Elixir/Erlang 在换行符上拆分位串?
【发布时间】:2013-11-18 10:00:02
【问题描述】:

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

A line of text
Additional line of text
And another line

我想要一个这样的数组:

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

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

提前致谢。

【问题讨论】:

    标签: erlang export newline elixir bitstring


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 虽然这个想法是正确的,但您的正则表达式中有一个额外的反斜杠,在第一个 | 字符之前。这是正确的版本:String.split("foo\r\nbar", ~r{\r\n|\r|\n})
      • 对,我已经编辑了答案以删除错字。谢谢!
      【解决方案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"]
      

      【讨论】:

        【解决方案4】:

        除了罗伯茨的回答。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 您也可以使用re,但在这种简单的情况下这有点过头了。
          猜你喜欢
          • 1970-01-01
          • 2018-01-24
          • 2014-08-05
          • 2017-02-07
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 2015-06-17
          相关资源
          最近更新 更多