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

问题描述 投票:0回答:2

字符串:

Lorem ipsum {{dolor}} sit {{amet}}, consectetur adipisicing {{elit}},

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

[substring](/tag/:substring_id) 

我可以用

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

但这对我没有帮助,因为我无法处理子字符串,即检查数据库。

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

预先感谢您的努力和时间:)

elixir phoenix-framework
2个回答
5
投票

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

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

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),
© www.soinside.com 2019 - 2024. All rights reserved.