Regex соответствует имени хоста - не включая TLD - PullRequest
3 голосов
/ 07 мая 2009

Мне нужно сопоставить имя хоста - но не хочу, чтобы tld:

example.com = ~ / regex / => пример

sub.example.com = ~ / regex / => sub.example

sub.sub.example.com = ~ / regex / => sub.sub.example

Любая помощь с регулярным выражением? Спасибо.

Ответы [ 6 ]

4 голосов
/ 07 мая 2009

Предполагая, что ваша строка правильно отформатирована и не включает в себя такие вещи, как протокол [т.е. http://], вам нужны все символы до, но не включая финальный .tld.

Так что это самый простой способ сделать это. Хитрость с регулярными выражениями не в том, чтобы усложнять вещи:

.*(?=\.\w+)

Это в основном говорит, дайте мне все символы в наборе, за которым следует [например] .xxx , который в основном просто возвращает все до последнего периода. 1012 *

Если у вас нет заглядывания в будущее, его, вероятно, будет проще всего использовать:

(\w+\.)+

, который даст вам все, вплоть до финального '.' а затем просто обрежьте '.'.

1 голос
/ 07 мая 2009

Попробуйте это

/.+(?=\.\w+$)/

без поддержки? = Это будет

/(.+)\.\w+$/

, а затем взять содержимое первой группы

0 голосов
/ 07 мая 2009

Вы могли бы просто раздеться:

s/\.[^\.]*$//;
0 голосов
/ 07 мая 2009
(?<Domain>.*)\.(?<TLD>.*?)$
0 голосов
/ 07 мая 2009

Мне не ясно, как вы хотите, чтобы матч работал. но с обычным расширенным регулярным выражением вы должны иметь возможность сопоставить любое слово с [a-zA-Z]{2,3} Так что, если вы пытаетесь получить полное имя, отличное от tld, что-то вроде

\(.\)\.[a-zA-Z]{2,3}$

должно быть близко.

0 голосов
/ 07 мая 2009
(.*)\.

Это на самом деле не относится к tlds, оно просто даст вам все до последнего периода в строке. Если вы хотите быть строгими в отношении действительных ДВУ или чего-либо еще, это должно быть написано по-другому.

...