我有一个可以包含电子邮件地址或IRI(国际化URI)的字符串。字符串不包含其他周围的空格或任何HTTP换行符。此外,它们在相应的规范中不包含标记为“过时”的任何元素。我需要一种简单的方法来区分字符串包含哪些内容。
我正在查看我认为是最新的相应规范:RFC 5322 § 3.4.1. Addr-Spec Specification用于电子邮件,RFC 3987 § 2.2. ABNF for IRI References and IRIs用于IRI。我提出了以下算法,并在括号中进行了说明:
"
开头,则为电子邮件地址。 (电子邮件地址local-part
可能是带引号的字符串,但IRI scheme
可能不是。)@
符号或冒号:
字符。@
符号,则该字符串包含一个电子邮件地址。:
字符,则字符串包含IRI。这种方法正确吗?还有另一种更简单的方法吗?最后,我将如何扩展该算法以区分IP地址(包括IPv4和IPv6)中的这两件事?
我认为所指定的规则是正确的,可以快速确定类型(电子邮件或IRI)。要将其扩展到IP地址,应添加其相应的语法:https://tools.ietf.org/html/draft-main-ipaddr-text-rep-00。
IpV4 = d8.d8.d8.d8
d8 = 0 to 255 (decimal)
IpV6 = d16:d16:d16:d16:d16:d16:(d16:d16 or Ipv4)
d16 = 0000 to ffff (hexadecimal)
with the added problem of the possibility of shortening multiple 0000 pieces into '::' (see link)
这会导致发现Ipv4与您的任何规则都不匹配。而且IpV6至少有6个冒号,最多有8个冒号:
。
因此,您的规则可以扩展为:
"
开头,则为电子邮件地址。 (电子邮件地址local-part
可能是带引号的字符串,但IRI scheme
可能不是。)@
符号或冒号:
字符。:
,则应匹配第一个冒号:
之前的部分::
开头或结尾时出现>::
或无双冒号但末尾没有IpV4时才可能出现7个冒号