Скажем, я хочу извлечь имя хоста и номер порта из строки следующим образом:
stackoverflow.com:443
Это довольно легко. Я мог бы сделать что-то вроде этого:
(?<host>.*):(?<port>\d*)
Я не беспокоюсь о схемах протоколов или действительных именах хостов/IP-адресах или портах tcp/udp, это не важно для моего запроса.
Тем не менее, мне также нужно поддерживать один твист, который делает это выше моих знаний о регулярных выражениях - имя хоста без порта:
stackoverflow.com
Я хочу использовать одно регулярное выражение для этого, и я хочу использовать именованные группы захвата, чтобы группа хостов всегда существовала в положительном совпадении, тогда как группа портов существует тогда и только тогда, когда у нас есть двоеточие, за которым следуют несколько цифр.
Я попытался сделать положительный взгляд из моего слабого понимания этого:
(?<host>.*)(?<=:)(?<port>\d*)
Это близко, но двоеточие (:) включено в конце захвата хоста. Поэтому я попытался изменить хост, чтобы включить что-либо, кроме двоеточия, как это:
(?<host>[^:]*)(?<=:)(?<port>\d*)
Это дает мне пустой захват хоста.
Любые предложения о том, как это сделать, т.е. сделать двоеточие и номер порта необязательными, но если они есть, включите захват номера порта и сделайте двоеточие "исчезающим"?
Изменить: Все четыре ответа, которые я получил, хорошо работают для меня, но обратите внимание на комментарии в некоторых из них. Я принял sln-ответ из-за хорошей компоновки и объяснения структуры regexp. Спасибо всем, кто ответил!