如何在elixir中使用正则表达式模式匹配提取所有子字符串

时间:2016-07-10 01:10:34

标签: elixir phoenix-framework

字符串: Lorem ipsum {{dolor}} sit {{amet}}, consectetur adipisicing {{elit}},

我想从上面提到的字符串中提取包含在{{}}中的所有标记的列表并对它们进行处理,即检查db是否存在,然后将它们替换为markdown链接,如下所示。

[substring](/tag/:substring_id) 

我可以用

代替它们
String.replace(string, ~r/\{\{.+?\}\}/, "new substring")

但这对我没有帮助,因为我无法处理子串,即检查db。

我没有找到任何String.scan或String.find类型的函数,它们将子字符串作为列表返回。如果你知道怎么做,请告诉我。

提前感谢您的努力和时间:)

2 个答案:

答案 0 :(得分:4)

您可以将Regex.replace/4与替换功能一起使用:

db = %{"dolor" => 1, "elit" => 2}

string = "Lorem ipsum {{dolor}} sit {{amet}}, consectetur adipisicing {{elit}},"

Regex.replace(~r/{{(.+?)}}/, string, fn whole, tag ->
  if id = db[tag] do
    "[#{tag}](/tag/#{id})"
  else
    whole
  end
end) |> IO.puts

输出:

Lorem ipsum [dolor](/tag/1) sit {{amet}}, consectetur adipisicing [elit](/tag/2),

答案 1 :(得分:3)

如果您只想将匹配的正则表达式提取到值列表中,则可以使用Regex.scan/3函数。

Regex.scan(~r/\{\{.+?\}\}/, string)
#[["{{dolor}}"], ["{{amet}}"], ["{{elit}}"]]