在Ruby中,我可以去:
"Sergio"[1..-1] #> "ergio"
在Elixir中执行相同操作会产生运行时错误:
iex(1)> "Sergio"[1..-1]
** (CompileError) iex:1: the Access syntax and calls to Access.get/2 are not available for the value: "Sergio"
也尝试过:
iex(1)> String.slice("Sergio", 1, -1)
** (FunctionClauseError) no function clause matching in String.slice/3
(elixir) lib/string.ex:1471: String.slice("Sergio", 1, -1)
如何从Elixir中的字符串中获取子字符串?
答案 0 :(得分:17)
您可以使用String.slice/2
:
iex(1)> String.slice("Sergio", 1..-1)
"ergio"
iex(2)> String.slice("Sergio", 0..-3)
"Serg"
答案 1 :(得分:3)
如果你想获得没有第一个字母的子字符串,你也可以使用:
"Sergio" |> String.to_charlist() |> tl() |> to_string()
另一种从末尾获取子串的方法是:
a = "Sergio"
len = String.length(a)
String.slice(a, -len + 1, len - 1) # "ergio"
#this -len + 1 is -1(len - 1) and it's exact to Ruby's -1 when slicing string.
答案 2 :(得分:-1)
除了String#slice
之外,还有其他方法可以得出相同的结果:
"Sergio" |> String.split(~r|(?<=\A.)|) |> List.last |> IO.inspect
#=> "ergio"
~r|(?<=\A.).*| |> Regex.run("Sergio") |> List.last |> IO.inspect
#=> "ergio"
在这种特殊情况下,它们没有带来任何附加值,但在一些更复杂的情况下(作为ruby的"Sergio"[/.../]
的参考,它们可能有一些意义。