Regex 不';带连字符的域的t工作正则表达式
我有一些智能脚本,可以检查服务器名并获取域名。例如,我有一个服务器名:example.ru01。我需要得到:example.ru我的scipt: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
#!/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
?我不认为你可以有带下划线的域名
Tryreg0=“\w*\([.-]\w*\)\+”
或reg0=“\w\+\([.-]\w\+\)\+”
获取域名的要求不明确。除了删除尾随数字,尚不清楚example.com01
如何映射到example.com
。您只是想删除任何尾随数字,还是有更全面的要求可以描述?