从Elixir中的String获取子字符串

时间:2016-10-25 03:36:25

标签: string elixir

在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中的字符串中获取子字符串?

3 个答案:

答案 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"[/.../]的参考,它们可能有一些意义。