Назад | Перейти на главную страницу

Регулярное выражение для второго и третьего уровня домена с дефисами

У меня есть умный скрипт, который проверяет имя сервера и получает доменное имя. Например, у меня есть имя сервера: example.ru01. Мне нужно получить: example.ru Мой scipt:

#!/bin/bash

hostname=example.com01
echo $hostname
reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z_-]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain

Все в порядке. на выходе у меня есть:

example.com01
example.com

Но когда я пишу домен третьего уровня, у меня получается:

example.com.us01
example.com

Итак, мне нужно еще одно регулярное выражение. Я написал это:

reg0="\(\([a-z0-9_-]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z_-]*\)\)"

Вывод:

example.com.us01
example.com.us

Оно работает. Но когда я пишу домен второго уровня, у меня получается:

example.com01
example

Итак ... Могу ли я написать регулярное выражение для двух типов домена?

Это похоже на вопрос домашнего задания.

Как насчет использования * в круглых скобках?

subdomain\.(domain)*

Или, как насчет того, чтобы просто удалить последние цифры?

(.*)[0-9][0-9]

Вам нужно быть более конкретным; вам нужно проверить ввод?

Я считаю, что вы можете решить свою проблему с помощью этого кода:

#!/bin/bash

hostname=test.example.com01 #or example.com01 or foo.test.example.com01
echo $hostname
reg0='^.*\.\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
reg1='^\([a-z0-9_-]*\.[a-z_-]*\)[0-9]*$'
domain=`expr "$hostname" : "$reg0" '|' "$hostname" : "$reg1"`
echo $domain

Позволь мне объяснить: expr STRING:REGEX будет делать то же самое, что и expr match. В | в середине означает: если "$hostname" : "$reg0" пустая попытка "$hostname" : "$reg1". Регулярные выражения неявно начинаются с ^, как сказано в документации coreutils, а возвращаемая строка - это та, которая находится внутри \( и \).

Помни это * жаден и старается подбирать все как можно дольше.

Сказано, что программа начинается с reg0, которые соответствуют всем доменам третьего, четвертого и т. Д. Уровня ... но не могут соответствовать example.com01 из-за первой точки. Если $hostname это не домен третьего уровня или более $reg0 верните null, и теперь идет reg1, который соответствует доменам в стиле example.com01.

Я попробовал программу и вроде все работает так, как вы хотите.