无法通过 shell 中的 REGEX 验证电子邮件域

无法通过 shell 中的 REGEX 验证电子邮件域

正则表达式运行良好正则表达式地点。

但在 shell 内使用它时,同样不起作用。

#!/bin/bash

authEmail="[email protected]"
echo "$authEmail"

if [[ "$authEmail" =~ ^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(test)\.com$ ]]; then
  echo "Proper Email detected $authEmail"
else
  echo "Email address $authEmail is invalid."
fi

它总是打印Email address [email protected] is invalid.

我错过了什么吗?

答案1

巴什的=~使用 POSIX 扩展正则表达式 (ERE),但您似乎正在使用聚合酶链式反应句法。具体来说,(?: )ERE 不支持非捕获语法。您需要将其传递给理解 PCRE 的工具(例如 GNU )grep,或者更改正则表达式。

  1. 使用GNUgrep

    #!/bin/bash
    
    authEmail="[email protected]"
    echo "$authEmail"
    
    if printf '%s\n' "$authEmail" | grep -qP '^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(test)\.com$'; then
      echo "Proper Email detected $authEmail"
    else
      echo "Email address $authEmail is invalid."
    fi
    
  2. 更改正则表达式

    #!/bin/bash
    
    authEmail="[email protected]"
    echo "$authEmail"
    
    if [[ "$authEmail" =~ ^[a-zA-Z0-9_.+-]+@(([a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?test\.com$ ]]; then
      echo "Proper Email detected $authEmail"
    else
      echo "Email address $authEmail is invalid."
    fi
    
    

当然,您实际上并不需要非捕获组。或者捕获组,就此而言,您也可以将 PCRE 表达式更改为:

^[a-zA-Z0-9_.+-]+@(([a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?test\.com$

答案2

我错过了什么吗?“不幸的是,是的。使用 RE 来正确验证电子邮件地址确实很困难。请参阅如何使用正则表达式验证电子邮件地址?在 StackOverflow 上,它提供了此 PCRERFC 5322遵守:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/ =?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\ [\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0 -9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5 [0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}( ?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[ a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\ x01-\x09\x0b\x0c\x0e-\x7f])+)\])

您可以自己使用它grep -Po

验证电子邮件地址的最安全方法是向其发送消息,并要求收件人单击链接或输入您所包含的令牌(单词、数字、短语)。

相关内容