我有一个可以包含电子邮件地址或 IRI(国际化 URI)的字符串。字符串不包含额外的环绕空格或任何 HTTP 换行字符。此外,它们不包含在其相应规范中标记为“过时”的任何元素。我需要一种简单的方法来区分字符串包含哪些内容。
我正在查看我认为是最新的相应规范:RFC 5322 § 3.4.1。电子邮件的 Addr-Spec 规范和RFC 3987 § 2.2。用于 IRI 参考的 ABNF 和用于 IRI 的 IRI。我提出了以下算法,括号内有解释:
- 如果字符串以引号
"
字符开头,则它是电子邮件地址。(电子邮件地址local-part
可能是带引号的字符串,但 IRIscheme
可能不是。) - 否则查找第一个 at
@
符号或冒号:
字符。- 如果遇到的字符是 at
@
符号,则字符串包含电子邮件地址。 - 否则,如果它是一个冒号
:
字符,则该字符串包含一个 IRI。
- 如果遇到的字符是 at
这种方法正确吗?还有另一种更简单的方法吗?最后作为奖励,我将如何扩展此算法以将这两件事与 IP 地址(包括 IPv4 和 IPv6)区分开来?