代码之家  ›  专栏  ›  技术社区  ›  Ronan Boiteau

如何删除Elixir中字符串的前n个字符?

  •  2
  • Ronan Boiteau  · 技术社区  · 8 年前

    我有一个字符串列表。这些字符串中的每一个都以我想去掉的n个字符开头。

    我不能用这样的东西 "123" <> new_string = old_string 因为 字符可以是任何内容 .

    所以我想这样做:

    my_list |> Enum.map(fn(str) ->
      # Remove the n leading characters from str
    end)
    

    你知道我怎样才能做到这一点吗?

    2 回复  |  直到 6 年前
        1
  •  12
  •   Dogbert    8 年前

    您可以使用 String.slice/2 删除字符串的前N个字母,以及 binary_part/3 或模式匹配以删除字符串的前N个字节。

    设置:

    iex(1)> a = "abc"
    "abc"
    iex(2)> b = "πr²"
    "πr²"
    

    删除字符串的前2个图形:

    iex(3)> String.slice(a, 2..-1)
    "c"
    iex(4)> String.slice(b, 2..-1)
    "²"
    

    删除字符串的前2个字节:

    iex(5)> binary_part(a, 2, byte_size(a) - 2)
    "c"
    iex(6)> binary_part(b, 2, byte_size(b) - 2)
    "r²"
    iex(7)> remove = 2
    2
    iex(8)> <<_::binary-size(remove), rest::binary>> = a; rest
    "c"
    iex(9)> <<_::binary-size(remove), rest::binary>> = b; rest
    "r²"
    
        2
  •  2
  •   Onorio Catenacci    8 年前

    另一种选择:

    defmodule StringExtensions do
      def remove_first_n_chars(s, n) do
        {_, new_string} = s |> String.codepoints() |> Enum.split(n)
        new_string |> Enum.join()
      end
    end
    

    然后会这样使用:

    l = ["abcdefg","hijklmno","pqrstuv"]
    
    l2 = l |> Enum.map(fn str -> StringExtensions.remove_first_n_chars(str,2) end) # l2 -> ["cdefg", "jklmno", "rstuv"]
    

    只是想提供一个潜在的替代品,FWIW。