正则表达式运行良好正则表达式地点。
但在 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
,或者更改正则表达式。
使用GNU
grep
#!/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
更改正则表达式
#!/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
。
验证电子邮件地址的最安全方法是向其发送消息,并要求收件人单击链接或输入您所包含的令牌(单词、数字、短语)。