如何在 Elixir 中使用 W3C 电子邮件正则表达式

How to use W3C Email Regex in Elixir

我正在尝试在 Elixir 中使用以下 W3C 电子邮件正则表达式(来源:RegexPal):

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

在一个看起来像这样的函数中

def get_type(value) do
    cond do
        String.match?(value, ~r/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) ->
            :email

        String.match?(value, ~r/^\+[1-9][0-9]\d{1,14}$/) ->
            :phone_number
    end
end

但是我遇到编译错误

unexpected token: "`" (column 56, code point U+0060)

我做错了什么?

由于您使用 / 来分隔印记的内容,因此您需要在正则表达式中转义 / 字符。另一种解决方案是选择不属于正则表达式的定界符(例如 '<)以避免转义。

~R/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
# or
~R<^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$>

避免这个问题的一种非常实用的方法是简单地将正则表达式写成字符串并调用 Regex.compile!在上面。

Regex.compile!("^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$")

这并没有特别回答你关于正则表达式的问题,@julp 完美地回答了这个问题。

我在这里告诉 不要使用正则表达式来验证电子邮件。你提到的正则表达式无论如何都不太正确。

这是一个完全有效的电子邮件示例,它不会通过您的正则表达式:"John Smith"@example.com

More.

所以我的猜测是:检查是否有 @

def get_type(value) do
  if String.contains?(value, "@"),
      do: :email,
    else: :phone_number
end