如何从Elixir中的字符串中删除第一个n个字符?

时间:2018-02-22 13:53:35

标签: string elixir

我有一个字符串列表。每个字符串都以我想要删除的n个字符开头。

我无法使用"123" <> new_string = old_string之类的内容,因为字符可以是

所以我想做这样的事情:

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

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

2 个答案:

答案 0 :(得分:10)

您可以使用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²"

答案 1 :(得分:2)

另一种选择:

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。