如上所述,目标是删除方括号和逗号。
我当前的解决方案如下:
给出:
"[40.45694301152436, -3.6907402812214514]"
|> String.replace("[", "")
|> String.replace(",", "")
|> String.replace("]", "")
|> String.split(" ")
|> Enum.map(fn x -> String.to_float(x) end)
输出:
[40.45694301152436, -3.6907402812214514]
我知道可以将其压缩得更多,但是我整天都在查看示例,而所有示例都无法完成上述工作。
答案 0 :(得分:4)
您可以将正则表达式传递给String.replace
,而不是字符串。在Elixir中,您可以使用~r
sigil构建正则表达式。
"[40.45694301152436, -3.6907402812214514]"
|> String.replace(~r'[\[\],]', "")
|> String.split()
|> Enum.map(&String.to_float/1)
答案 1 :(得分:0)
如果您关注的是可读性,则@fhdhsni给了您很好的答案,我建议将整个内容抽象为一个单独的函数,如下所示:
defmodule T do
def parsefloats(stringtobeparsed) do
stringtobeparsed
|> String.replace("[", "")
|> String.replace(",", "")
|> String.replace("]", "")
|> String.split(" ")
|> Enum.map(fn x -> String.to_float(x) end)
end
end
然后您这样称呼它:
[x,y] = T.parsefloats("[40.45694301152436, -3.6907402812214514]")
# [40.45694301152436, -3.6907402812214514]
iex(3)> x
# 40.45694301152436
iex(4)> y
# -3.6907402812214514
在更紧凑的代码方面并没有什么更好的,但我认为它更具可读性。
答案 2 :(得分:0)
这是另一个选择,使用String.slice
:
"[40.45694301152436, -3.6907402812214514]"
|> String.slice(1..-2)
|> String.split(~r/,\s+/)
|> Enum.map(&String.to_float/1)
干杯!
答案 3 :(得分:0)
除了字符串替换解决方案之外,您还可以查看Code.eval_string。
这样,将对字符串进行解析,您将返回要查找的列表;
{list, _} = Code.eval_string "[40.45694301152436, -3.6907402812214514]"
# {[40.45694301152436, -3.6907402812214514], []}
答案 4 :(得分:0)
我认为关于您使用JSON解析器的问题的评论是最好的,然后是fhdhsni的简单答案。但这是一种提取数字而不是替换括号的方法:
str = "[40.45694301152436, -3.6907402812214514]"
regex = ~r/([\d\.-]+), ([\d\.+-]+)/
Regex.run(regex, str, capture: :all_but_first) |> Enum.map(&String.to_float/1)
输出:
[40.45694301152436, -3.6907402812214514]