Regex 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"

您能在Elixir中的
案例中使用正则表达式吗

因此,大致如下:

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没有这种模糊的魔力。也许在《长生不老药》中,我需要多打一点,但至少我知道发生了什么;-)这是非常正确的,事实上,权衡是很困难的。谢谢你的代码示例!因为有人给我发电子邮件询问这个代码的许可:我认为它是在公共领域。因此,请随意使用它,无需附加属性或字符串。