使用Bash中的正则表达式检查电子邮件地址的正确性

bal*_*tud 6 regex bash shell email-validation

我正在尝试制作一个Bash脚本来检查电子邮件地址是否正确.

我有这个正则表达式:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.regular-expressions.info/email.html

这是我的bash脚本:

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

i="test@terra.es"
if [[ $i=~$regex ]] ; then
    echo "OK"
else
    echo "not OK"
fi
Run Code Online (Sandbox Code Playgroud)

脚本失败并给我输出:

10:语法错误:反引号替换中的EOF

任何线索?

Pet*_*aut 9

你有几个问题:

  • 需要引用正则表达式并转义特殊字符.
  • 正则表达式应该被锚定(^$).
  • ?: 不受支持,需要删除.
  • 您需要在=~操作员周围留出空间.

最终产品:

regex="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"

i="test@terra.es"
if [[ $i =~ $regex ]] ; then
    echo "OK"
else
    echo "not OK"
fi
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 7

您不必创建这样复杂的正则表达式来检查有效的电子邮件.您可以简单地拆分"@",然后检查是否有2个项目,一个位于@前面,另一个位于后面.

i="test@terraes"
IFS="@"
set -- $i
if [ "${#@}" -ne 2 ];then
    echo "invalid email"
fi
domain="$2"
dig $domain | grep "ANSWER: 0" 1>/dev/null && echo "domain not ok"
Run Code Online (Sandbox Code Playgroud)

要进一步检查域,您可以使用dig之类的工具来查询域.它比正则表达式更好,因为@ new.jersey与正则表达式匹配,但它实际上不是一个合适的域.

  • 我实际上认为这是一种更明智的方法。想想所有不允许使用的网站:test+marker@domain.com 即使这是一封完全有效的电子邮件。它应该摆脱大多数假货,仍然可以。你可以通过检查'.'的存在来使它更强大一些。在第二个元素中,并确保它在 2 个子元素中分隔第二个元素。以国际域名为例 (2认同)

sth*_*sth 5

引号,反引号和其他是shell脚本中的特殊字符,如果像分配中那样使用它们,则需要进行转义regex.您可以使用反斜杠转义特殊字符,或者如果省略其中使用的单引号,则在正则表达式周围使用单引号.

我建议使用更简单的正则表达式,.*@.*因为所有的复杂性都是徒劳的.foo@example.com看起来非常好,任何正则表达式都会接受它,但它仍然不存在.