带连字符的第二和第三级域名的正则表达式

带连字符的第二和第三级域名的正则表达式

我有一些智能脚本,用于检查服务器名称并获取域名。例如,我有服务器名称:example.ru01。我需要获取:example.ru 我的脚本:

#!/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

那么...我可以为两种类型的域编写一个正则表达式吗?

答案1

这看起来像一道家庭作业题。

使用带括号的 * 怎么样?

subdomain\.(domain)*

或者,简单地去掉最后几位数字怎么样?

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

您需要更具体一点;您需要验证输入吗?

答案2

我相信您可以使用以下代码解决您的问题:

#!/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"为空,则尝试。正如 coreutils 文档所述,正则表达式隐式以 ^ 开头,并且返回的字符串是和"$hostname" : "$reg1"里面的字符串。\(\)

请记住,这*是贪婪的,并会尽可能地匹配所有内容。

也就是说,程序从匹配所有三级、四级等域的 reg0 开始……但由于第一个点,无法匹配 example.com01。如果$hostname不是三级域或更多,则$reg0返回 null,然后是匹配 example.com01 样式域的 reg1。

我已经尝试过该程序并且一切似乎都按照你想要的方式运行。

相关内容