Могу я предложить построить регулярное выражение
(smtp|SMTP|X400|X500):((?!smtp:|SMTP:|X400:|X500:).)*;?
или без протокола
.*?:((?![^:;]*:).)*;?
другими словами, найдите все, что начинается с одного из ваших протоколов. Подходим двоеточие. Затем продолжайте сопоставлять символы, если вы не соответствуете ни одному из ваших протоколов. Завершите точкой с запятой (опционально).
Затем вы можете проанализировать список совпадений, разделив его на ':', и вы получите свои протоколы. Кроме того, если вы хотите добавить протоколы, просто добавьте их в список.
Вероятно, однако, вы захотите указать все это без учета регистра и перечислить протоколы только в верхнем или нижнем регистре.
Для версии без протокола все равно, как называются протоколы. Он просто находит их все одинаковыми, сопоставляя все до, но исключая строку, за которой следует двоеточие или точка с запятой.