Regex 不';带连字符的域的t工作正则表达式

Regex 不';带连字符的域的t工作正则表达式,regex,linux,bash,sh,Regex,Linux,Bash,Sh,我有一些智能脚本,可以检查服务器名并获取域名。例如,我有一个服务器名:example.ru01。我需要得到:example.ru我的scipt: #!/bin/bash hostname=example.com01 echo $hostname reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)" domain=`expr match $hostname $reg0` echo $domain 没关系。在输出中,我有: example.com

我有一些智能脚本,可以检查服务器名并获取域名。例如,我有一个服务器名:example.ru01。我需要得到:example.ru我的scipt:

#!/bin/bash

hostname=example.com01
echo $hostname
reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain
没关系。在输出中,我有:

example.com01
example.com
但是,在我的基础设施中,我有一些带有连字符的域。例如:test-test.com01。但在我的脚本中它不起作用。如何解决这个问题?请帮忙。我在正则表达式中做了一些更改,如下所示:

\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)

但它不起作用。我哪里有错误?请帮忙。谢谢您的关注。

您的思路是正确的,您遇到的一个小问题是,您将
-
添加到了Regex中负责匹配域最后一部分的部分,如
.com
.net
.ru
。相反,您应该将
-
添加到正则表达式的第一部分。这应该起作用:

req0="\(\(\[a-z0-9_-]*\.[a-z]*\)\|\([a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]*\)\)"

此正则表达式
[a-z0-9.]
可以使用此令牌
\w
缩短,并且它可以正常工作。但是,这个标记在bash中似乎不起作用,因此,我使用了
[a-z0-9]
来添加
-
是,
测试test.com01
将不匹配

但是,
www.test-test.com01
将:

$ hostname="www.test-test.com01"
$ reg0="\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)"
$ expr match $hostname $reg0
www.test-test.com
问题是您需要一个可选的
w
(零次或多次)和一个点
\。

事实上,你写的是“一个单词”
\w
,在这种情况下,如果你想匹配的是“www”,你应该删除反斜杠

此外,域名中的下划线不正确。这是您应该使用的正确正则表达式:

reg0="\(\(w\{1,3\}\.\)\?[a-z-]\+\(\.[a-z-]*\)\?\)"
在这个例子中,
www.
是可选的,然后是一个或(可选的)两个名称,中间有一个点

但是,域名可以包括数字:
www.1和1.com

事实上,要当心!!现在,它们可以包含任何有效的UTF-8字符串:

从第3.3节:

扩展了的定义,以允许RFC和 5321定义和符合以下条件的DNS标签中的UTF-8字符串 使用IDNA定义[RFC5890]

和第2.3.2.1节

“U标签”是一个IDNA有效的Unicode字符字符串,以 标准化形式C(NFC)并至少包括一个非ASCII 字符,以标准Unicode编码形式表示(例如 UTF-8)


你只是想删除
01
?我不认为你可以有带下划线的域名
Try
reg0=“\w*\([.-]\w*\)\+”
reg0=“\w\+\([.-]\w\+\)\+”
获取域名的要求不明确。除了删除尾随数字,尚不清楚
example.com01
如何映射到
example.com
。您只是想删除任何尾随数字,还是有更全面的要求可以描述?