Regex соответствует имени хоста & # 8212; не включая ДВУ
Вопрос
Мне нужно сопоставить имя хоста, но не хочу, чтобы tld:
example.com = ~ / regex / = > Пример р>
sub.example.com = ~ / regex / = > sub.example р>
sub.sub.example.com = ~ / regex / = > sub.sub.example р>
Любая помощь с регулярным выражением? Спасибо.
Решение
Предполагая, что ваша строка правильно отформатирована и не включает в себя такие вещи, как протокол [т.е. http: //] , вам нужны все символы вплоть до, но не включая окончательный .tld.
Так что это самый простой способ сделать это. Хитрость с регулярными выражениями не в том, чтобы усложнять вещи:
.*(?=\.\w+)
Это в основном говорит, дайте мне все символы в наборе, за которым следует [например] .xxx , который в основном просто вернет все до последнего периода . р>
Если у вас нет заглядывания в будущее, его, вероятно, будет проще всего использовать:
(\w+\.)+
который даст вам все, вплоть до финального '.' а затем просто обрежьте «.».
Другие советы
Попробуйте это
/.+(?=\.\w+$)/
без поддержки? = это было бы
/(.+)\.\w+$/
а затем взять содержимое первой группы
Вы можете просто снять с себя:
s/\.[^\.]*$//;
(?<Domain>.*)\.(?<TLD>.*?)$
(.*)\.
Это на самом деле не относится к tlds, оно просто даст вам все до последнего периода в строке. Если вы хотите быть строгими в отношении действительных ДВУ или чего-либо еще, это должно быть написано по-другому.
Мне не ясно, как вы хотите, чтобы матч работал. но с обычным расширенным регулярным выражением вы должны быть в состоянии сопоставить любое слово с [a-zA-Z] {2,3}
Так что если вы пытаетесь получить полное имя, отличное от tld что-то вроде
\(.\)\.[a-zA-Z]{2,3}$
должно быть близко.