У меня есть строка, которая может содержать либо адрес электронной почты, либо IRI (интернационализированный URI). Строки не содержат дополнительных окружающих пробелов или каких-либо символов переноса строк HTTP. Более того, они не содержат элементов, помеченных как «устаревшие» в соответствующих спецификациях. Мне нужен простой способ отличить guish, какие из этих вещей содержит строка.
Я смотрю на то, что я считаю последними соответствующими спецификациями: RF C 5322 § 3.4.1. Addr-Spe c Спецификация для электронной почты и RF C 3987 § 2.2. ABNF для IRI Ссылки и IRI для IRI. Я придумал следующий алгоритм с пояснениями в скобках:
- Если строка начинается с символа
"
в кавычках, это адрес электронной почты. (Адрес электронной почты local-part
может быть строкой в кавычках, но IRI scheme
не может.) - В противном случае найдите первый знак
@
или двоеточие :
. - Если встреченный символ является знаком
@
, строка содержит адрес электронной почты. - В противном случае, если это символ двоеточия
:
, строка содержит IRI.
Это правильный подход? Есть ли другой более простой подход? И наконец, в качестве бонуса, как бы я расширил этот алгоритм, чтобы он также отличал guish эти две вещи от IP-адреса (включая IPv4 и IPv6)?