在文档中,我没有找到如何在Elixir中使用捕获组的描述。我怎样才能做到这一点?比如,我想从字符串中提取子字符串并将其替换为其他字符串:
~r"\[tag1\](.+?)\[\/tag1\]"
如何在] [/
之间访问字符串?
答案 0 :(得分:2)
使用Regex.run/3
进行1次匹配,Regex.scan/3
进行所有匹配,或查看Regex
模块中的其他功能。
iex(1)> regex = ~r"\[tag1\](.+?)\[\/tag1\]"
~r/\[tag1\](.+?)\[\/tag1\]/
iex(2)> [_, inner] = Regex.run(regex, "[tag1]bar[/tag1]")
["[tag1]bar[/tag1]", "bar"]
iex(3)> inner
"bar"
iex(4) Regex.scan(regex, "[tag1]bar[/tag1] [tag1]baz[/tag1]")
[["[tag1]bar[/tag1]", "bar"], ["[tag1]baz[/tag1]", "baz"]]
答案 1 :(得分:0)
文档在隐藏它方面做得很好,但它就在那里:https://hexdocs.pm/elixir/1.0.5/Regex.html#replace/4
替换可以是字符串或函数。该字符串用作每个匹配的替换,它允许通过\ N或\ g {N}访问特定捕获,其中N是捕获。如果使用\ 0,则插入整个匹配。
注意:\
中的\N
需要进行转义,以便\\N
使用Regex.replace/4
(或管道时为String.replace/4
,因为字符串是第一个参数),使用一个命令执行此操作。
您实际上并不需要首先捕获] [\
之间的内容。您只需要匹配并替换它。此解决方案使用“外观”,您可以在此处找到更多信息:http://www.regular-expressions.info/lookaround.html
iex(1)> String.replace("[tag1]foo[/tag1]", ~r"\w+(?=\[)", "bar")
"[tag1]bar[/tag1]"