我有一组字符串列表。每个字符串都以n个字符开头,我想把它们去掉。
我不能像"123" <> new_string = old_string
这样使用,因为这些字符可以是任何字符。
所以我想做类似于下面的操作:
my_list |> Enum.map(fn(str) ->
# Remove the n leading characters from str
end)
你知道我该如何实现这个吗?
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²"
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"]
我想提供一个可能的替代方案,供参考。