Regex Elixir案例中的正则表达式
您能在Elixir中的Regex Elixir案例中的正则表达式,regex,elixir,Regex,Elixir,您能在Elixir中的案例中使用正则表达式吗 因此,大致如下: case some_string do "string" -> # do something ~r/string[\d]+/ -> # do something _ -> # do something end 使用case是不可能的,但您可以使用cond: cond do some_string == "string"
案例中使用正则表达式吗
因此,大致如下:
case some_string do
"string" -> # do something
~r/string[\d]+/ -> # do something
_ -> # do something
end
使用case
是不可能的,但您可以使用cond
:
cond do
some_string == "string" -> # do something
String.match?(some_string, ~r/string[\d]+/) -> # do something
true -> # do something
end
原因是无法通过调用特定值的特殊函数来连接到模式匹配中。我想你是从Ruby那里得到这个想法的,Ruby通过定义特殊操作符===
来实现这一点。Ruby的case语句会隐式地调用它,对于正则表达式,它将匹配给定的值。正如Patrick在他的回答中所说,这没有内置的,而cond
可能是您最好的选择
但要添加另一个选项并展示Elixir的灵活性:因为case
只是Elixir中的一个宏,所以可以实现自己的宏,如regex\u case
您应该记住,这可能会使项目中的新手更难理解代码,但是如果您进行了大量正则表达式匹配,那么这种权衡可能是有意义的。你是法官
我刚才只是想看看有没有可能:
defmodule RegexCase do
defmacro regex_case(string, do: lines) do
new_lines = Enum.map lines, fn ({:->, context, [[regex], result]}) ->
condition = quote do: String.match?(unquote(string), unquote(regex))
{:->, context, [[condition], result]}
end
# Base case if nothing matches; "cond" complains otherwise.
base_case = quote do: (true -> nil)
new_lines = new_lines ++ base_case
quote do
cond do
unquote(new_lines)
end
end
end
end
defmodule Run do
import RegexCase
def run do
regex_case "hello" do
~r/x/ -> IO.puts("matches x")
~r/e/ -> IO.puts("matches e")
~r/y/ -> IO.puts("matches y")
end
end
end
Run.run
我懂了。谢谢我确实从Ruby那里得到了这个想法;)不知道关于==
的事。也谢谢你<代码>=
在Ruby中可以做各种事情:例如,对于类名,它会检查值是否是类的实例;对于范围,它会检查值是否在范围内;对于匿名函数(procs/lambdas),它甚至会调用函数,等等。我真的很喜欢Elixir没有这种模糊的魔力。也许在《长生不老药》中,我需要多打一点,但至少我知道发生了什么;-)这是非常正确的,事实上,权衡是很困难的。谢谢你的代码示例!因为有人给我发电子邮件询问这个代码的许可:我认为它是在公共领域。因此,请随意使用它,无需附加属性或字符串。