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

3

我有一组字符串列表。每个字符串都以n个字符开头,我想把它们去掉。

我不能像"123" <> new_string = old_string这样使用,因为这些字符可以是任何字符

所以我想做类似于下面的操作:

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

你知道我该如何实现这个吗?
2个回答

15
你可以使用 String.slice/2 来移除字符串的前 N 个 grapheme,也可以使用 binary_part/3 或模式匹配来移除字符串的前 N 个字节。
设置:
iex(1)> a = "abc"
"abc"
iex(2)> b = "πr²"
"πr²"

从一个字符串中删除前两个字元:

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

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

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
另一个选择:
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"]

我想提供一个可能的替代方案,供参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接