长生不老药正则表达式代替方形刹车片和逗号

时间:2019-03-05 17:06:52

标签: regex elixir

如上所述,目标是删除方括号和逗号。
我当前的解决方案如下:

给出:

"[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]

我知道可以将其压缩得更多,但是我整天都在查看示例,而所有示例都无法完成上述工作。

5 个答案:

答案 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]